当前位置: 首页 > news >正文

算法设计与分析实验报告c++实现(生命游戏、带锁的门、三壶谜题、串匹配问题、交替放置的碟子)

一、实验目的

1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;
2.提高学生利用课堂所学知识解决实际问题的能力;
3.提高学生综合应用所学知识解决实际问题的能力。

二、实验任务

1、 编写一个生命游戏:
规则如下:(或者网上找到更详细的规则)
一个人可以有8个邻居;
一个人若只有一个邻居,在下一代会孤独的死去;
若有2或3个邻居,在下一代依然活着;
若有4个或以上邻居,在下一代会因拥挤而死;
死去的人若有3个邻居,在下一代会复活;
所有的死去或复活都在下一代变化时同时发生。
2、 带锁的门:
在走廊上有n个带锁的门,从1到n依次编号。最初所有的门都是关着的。我们从门前经过n次,每次都从1号门开始。在第i次经过时(i = 1,2,…, n)我们改变i的整数倍号锁的状态;如果门是关的,就打开它;如果门是打开的,就关上它。在最后一次经过后,哪些门是打开的,哪些门是关上的?有多少打开的门?
3、三壶谜题:
有一个充满水的8品脱的水壶和两个空水壶(容积分别是5品脱和3品脱)。通过将水壶完全倒满水和将水壶的水完全倒空这两种方式,在其中的一个水壶中得到4品脱的水。
4、串匹配问题
给定一段文本,在该文本中查找并定位任意给定字符串。
要求:
(1)实现BF算法;(必做)
(2) 实现BF算法的改进算法:KMP算法和BM算法;(选做)
5、交替放置的碟子
我们有数量为2n的一排碟子,n黑n白交替放置:黑,白,黑,白…
现在要把黑碟子都放在右边,白碟子都放在左边,但只允许通过互换相邻碟子的位置来实现。为该谜题写个算法,并确定该算法需要执行的换位次数。

三、实验设备及编程开发工具

实验设备:win10电脑
编程开发工具:Microsoft Visual c++

四、实验过程设计(算法设计过程)

(一)、生命游戏

1、算法分析
规则如下:(或者网上找到更详细的规则)
一个人可以有8个邻居;一个人若只有一个邻居,在下一代会孤独的死去;
若有2或3个邻居,在下一代依然活着;若有4个或以上邻居,在下一代会因拥挤而死;
死去的人若有3个邻居,在下一代会复活;所有的死去或复活都在下一代变化时同时发生。
可以把最初的细胞结构定义为种子,当所有在种子中的细胞同时被以上规则处理后, 可以得到第一代细胞图。继续让规处理当前的细胞图,可以得到下一代的细胞图,周而复始。在游戏的进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状已经锁定,不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。

2、源代码

// 生命游戏.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
#define NUM_CELL_CUBE_MODEL 5
//定义细胞结构
struct Cell
{bool live; //标志是否存活int  others; //标志周围的存活细胞数
};int _tmain(int argc, _TCHAR* argv[])
{//定义细胞数组Cell cell[NUM_CELL_CUBE_MODEL][NUM_CELL_CUBE_MODEL];//步骤1:初始化,把所有格子的细胞初始化成活的,周围没有其他细胞for (int i = 0; i < NUM_CELL_CUBE_MODEL; i++){for (int j = 0; j < NUM_CELL_CUBE_MODEL; j++){cell[i][j].live = true;cell[i][j].others = 0;}}//初始化值可以自己设定for (int i = 0; i < NUM_CELL_CUBE_MODEL; i++){for (int j = 0; j < NUM_CELL_CUBE_MODEL; j++){cell[i][j].live = false;cell[i][j].others = 0;}}cell[0][2].live = true;cell[1][2].live = true;cell[2][2].live = true;cell[3][2].live = true;cell[4][2].live = true;//步骤2:细胞不断变化while (1){//步骤2.1:遍历所有细胞,进行显示,并统计周围数量for (int i = 0; i < NUM_CELL_CUBE_MODEL; i++){for (int j = 0; j < NUM_CELL_CUBE_MODEL; j++){//步骤2.1.1:每次变化前,先把每个细胞周围死亡数量设为0cell[i][j].others = 0;//步骤2.1.2:每个细胞如果是活的标记★,死的标记☆if (cell[i][j].live){cout << "★  ";}else{cout << "☆  ";}//步骤2.1.3:检测八个方向是否有存活细胞,计算每一个细胞的周围存活数if ((i - 1) >= 0 && (j - 1) >= 0 && cell[i - 1][j - 1].live)cell[i][j].others++;if ((i - 1) >= 0 && cell[i - 1][j].live)cell[i][j].others++;if ((i - 1) >= 0 && (j + 1) < NUM_CELL_CUBE_MODEL && cell[i - 1][j + 1].live)cell[i][j].others++;if ((j - 1) >= 0 && cell[i][j - 1].live)cell[i][j].others++;if ((j + 1) < NUM_CELL_CUBE_MODEL && cell[i][j + 1].live)cell[i][j].others++;if ((i + 1) < NUM_CELL_CUBE_MODEL && (j - 1) >= 0 && cell[i + 1][j - 1].live)cell[i][j].others++;if ((i + 1) < NUM_CELL_CUBE_MODEL && cell[i + 1][j].live)cell[i][j].others++;if ((i + 1) < NUM_CELL_CUBE_MODEL && (j + 1) < NUM_CELL_CUBE_MODEL && cell[i + 1][j + 1].live)cell[i][j].others++;}cout << endl << endl;}//步骤2.2:根据统计数量,重新计算下一刻的存活情况for (int i = 0; i < NUM_CELL_CUBE_MODEL; i++){for (int j = 0; j < NUM_CELL_CUBE_MODEL; j++){//步骤2.2.1:活着的可能死if (cell[i][j].live){switch (cell[i][j].others){case 2:case 3:cell[i][j].live = true; break;default:cell[i][j].live = false; break;}}//步骤2.2.2:死了的可能活else{if (cell[i][j].others == 3){cell[i][j].live = true;}}}}//每1秒刷新一次Sleep(1000);//清楚屏幕函数system("cls");}return 0;
}

(二)、带锁的门

1、门的状态只有两 种,每经过一次,状态就会发生变化。如果一道门经过奇数次,那么结果状态和原始状态就会不一样,而经过偶数次则不会发生变化。因此问题的关键就是找出那些 经过奇数次的门有多少道。很幸运,那些门的编号正好是整数i的完全平方数即1,4,9,16,…,因此只需要找出这样的数字有多少个即可。
如:假设n = 5
0表示门是关着的,1表示门打开的
一 二 三 四 五
一 1 1 1 1 1
二 1 0 1 0 1
三 1 0 0 0 1
四 1 0 0 1 1
五 1 0 0 0 0
可以发现对角线上的数字就是最后门打开的情况,正好是i的平方数

2、源代码

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define MAX 10000;
int remainder(int n,int i)
{int remainder = 1;remainder = n%i;if(remainder == 0)return 1;
}
int main(int argc, char **argv)
{int n;int remaind = 0;printf("please input a num:\n");scanf("%d",&n);if (n > 10000){printf("your num is too large!please try it again:");scanf("%d",&n);}int door[10000];for(int i = 0;i < 10000;i++){door[i] = -1;}for ( i = 1;i < n+1;i++){for(int j = 1;j < n;j++){remaind = remainder(j,i);if(remaind ==1)door[j] = door[j] * (-1);}}printf("which door is open:\n");for(int k = 1;k < n;k++){if(door[k] > 0)printf("%d ",k);}printf("\n");printf("which door is close:\n");for( k = 1;k < n;k++){if(door[k] < 0)printf("%d ",k);}printf("\n");system("pause");return 0;
}

(三)、三壶谜题

1、算法分析
可以把每次三个水壶中水的量组成一个状态,比如初始状态为008,对应第一个水壶0品脱水,第二个水壶0品脱水,第三个水壶8品脱水。对题目的状态空间图进行广度优先遍历。当表示状态的数字中出现4时,即求出答案。
为了打印出倒水的过程,需要声明一个前置状态保存当前状态由哪个状态转换而来,然后就可以回溯到初始状态,打印出倒水过程。相当于树中的父结点。
可以声明一个map表,保存已有的状态,对已有的状态,就不再向下继续遍历,这样可以节省求解时间。
因为是广度优先遍历,所以第一次解得的答案所需的倒水的次数最少,解为最优解。

2、源代码

#include <iostream>
#include <vector>
#include <map>
#define MaxFirst 3
#define MaxSecond 5
#define MaxThird 8
using namespace std;
class State
{
public:int second;int num[3];State* preState;static map<int,int> mapping;
public:State(int first,int second,int third){num[0]=first;num[1]=second;num[2]=third;	}void init(){		mapping[0]=MaxFirst;mapping[1]=MaxSecond;mapping[2]=MaxThird;}bool canPour(int from,int to)//判断是否可以从from水壶中倒水到to水壶中{if(num[from]==0){return false;}if(num[to]==mapping[to]){return false;}else {return true;}}void pour(int from,int to)//倒水过程{if(num[from]+num[to]>mapping[to]){num[from]=num[from]-(mapping[to]-num[to]);num[to]=mapping[to];}else{num[to]=num[to]+num[from];num[from]=0;}}
};
map<int,int> State::mapping;int main()
{map<int,int> states;State *start=new State(0,0,8);start->init();State *state=start;State *endState=new State(8,8,8);//只有获得解endState才会改变,赋值全为8为了方便判断是否获得最终解vector<State> action;//保存所有状态对象action.push_back(*start);//把初始状态先加入队列中int n=0;do{for(int i=0;i<3;i++)//双层循环为从i水壶中倒水入j水壶中{for(int j=0;j<3;j++){if(i!=j){if(state->canPour(i,j)){state->pour(i,j);if(states[state->num[0]*100+state->num[1]*10+state->num[2]]==0)//如果该状态不在hash表中,即为第一次出现该状态{states[state->num[0]*100+state->num[1]*10+state->num[2]]++;(state->preState)=new State(action[n]);action.push_back(*state);if(state->num[0]==4||state->num[1]==4||state->num[2]==4)//获得解{endState=state;i=4;break;	}}}}*state=action[n];}			}n++;}while(endState->num[0]==8&&endState->num[1]==8&& n<action.size());cout<<endState->num[0]<<" "<<endState->num[1]<<" "<<endState->num[2]<<endl;state=endState;do{state=state->preState;cout<<state->num[0]<<" "<<state->num[1]<<" "<<state->num[2]<<endl;		}while(state->num[2]!=8);return 0;
}

(四)、串匹配问题

1、 算法分析
蛮力法(brute force method,也称为穷举法或枚举法)是一种简单直接地解决问题的方法,常常直接基于问题的描述,所以,蛮力法也是最容易应用的方法。但是,用蛮力法设计的算法时间特性往往也是最低的,典型的指数时间算法一般都是通过蛮力搜索而得到的。
BF算法:
暴力检索法是最好想到的算法,也最好实现,在情况简单的情况下可以直接使用:
首先将原字符串和子串左端对齐,逐一比较;如果第一个字符不能匹配,则子串向后移动一位继续比较;如果第一个字符匹配,则继续比较后续字符,直至全部匹配。

2、 源代码

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
using namespace std;
// 蛮力算法
int BF(string ts, string ps) 
{int i = 0; // 主串的位置int j = 0; // 模式串的位置while (i < ts.length() && j < ps.length()){if (ts[i] == ps[j]) { // 当两个字符相同,就比较下一个i++;j++;}else {i = i - j + 1; // 一旦不匹配,i后退j = 0; // j归0}}if (j == ps.length()) {return i - j;}else {return -1;}
}
// KMP算法计算KMP值(Next值)
//当T[i] != P[j]时
//有T[i - j ~i - 1] == P[0 ~j - 1]
//由P[0 ~k - 1] == P[j - k ~j - 1]
//必然:T[i - k ~i - 1] == P[0 ~k - 1]
vector<int> getNext(string ps) 
{vector<int> next;next.push_back(-1);int j = 0;int k = -1;while (j < ps.length() - 1) {if (k == -1 || ps[j] == ps[k]) {++j;next.push_back(++k);}else{k = next[k];}}return next;
}
// KMP算法
int KMP(string ts, string ps)
{int i = 0; // 主串的位置int j = 0; // 模式串的位置vector<int> next = getNext(ps);while (i < ts.length() && j < ps.length()) {if (j == -1 || ts[i] == ps[j]){// 当j为-1时,要移动的是i,当然j也要归0i++;j++;}else{// i不需要回溯了j = next[j]; // j回到指定位置}}if (j == ps.length()){return i - j;}else {return -1;}
}
int _tmain(int argc, _TCHAR* argv[])
{string A, B;cout << "请输入主串:";cin >> A;cout << "请输入要查找的字符串:";cin >> B;//使用蛮力算法求解int nPosition = BF(A, B);//使用KMP算法求解//int nPosition = KMP(A, B);if (nPosition != -1){cout << "在第" << nPosition + 1 << "个位置,找到了子串!\n";}else{cout << "没有找到子串!\n";}system("pause");return 0;
}

(五)、交替放置的碟子

1、 算法分析
2、
首先把问题转化一下,用1表示黑碟子,0表示白碟子,那么目前的顺序是:
1010…1010
结果要求1都放在右边,0都放在左边。这个题目看起来很眼熟。看关键字:交换相邻的碟子,排好顺序。嗯,就是经常出现在面试中的冒泡排序了。
为便于观察,假设目前有6个碟子:101010。使用冒泡排序,第一次迭代,碟子序列变为:010101,交换3次。在进行第二次迭代之前,观察一下。
现在,不仅第一个碟子就位,最后一个也是了,因此第二次迭代只需要对第2到第5个进行排序,巧合的是,碟子[2->5]仍然是10交替出现,不过比上一次少了两个,这样就简单了,可以得到结论:对于2n个碟子,可以使用n次迭代完成,交换的次数分别是:n+(n-1)+…+2+1,即n(n+1)/2。
2、源代码

#include "stdafx.h"
#include <string>
#include <iostream>
#include <stdlib.h>
using namespace std;
#define  PROBLEM_LARGE 10
#define  ALL_CATE_NUM PROBLEM_LARGE*2
static string arrAllCate[ALL_CATE_NUM];
//交替算法:方法1
void WayChange1()
{int nChangePosition = 0;int nCirCle = 0;for (int i = 0; i < PROBLEM_LARGE; ++i){int nNow = i + 1;do{if (arrAllCate[nNow - 1] != arrAllCate[nNow]){//交换两个相邻元素值string strRange = arrAllCate[nNow - 1];arrAllCate[nNow - 1] = arrAllCate[nNow];arrAllCate[nNow] = strRange;//交换次数加1++nChangePosition;}++nNow;//循环次数加1++nCirCle;} while (nNow < ALL_CATE_NUM);//每一趟的结果都输出出来cout << "第" << i + 1 << "趟结果:";for (int j = 0; j < ALL_CATE_NUM; ++j){cout << arrAllCate[j] << " ";}cout << endl << endl;}cout << "交换次数:" << nChangePosition << endl;cout << "循环次数:" << nCirCle << endl;
}
//交替算法:方法2
void WayChange2()
{int nChangePosition = 0;int nCirCle = 0;for (int i = 0; i < PROBLEM_LARGE;++i){int head = i;int tail = ALL_CATE_NUM - i - 1;do{if (tail - head == 1){string strMid = arrAllCate[head];arrAllCate[head] = arrAllCate[tail];arrAllCate[tail] = strMid;//交换次数加1++nChangePosition;}else{string strRangehead = arrAllCate[head];arrAllCate[head] = arrAllCate[head + 1];arrAllCate[head + 1] = strRangehead;string strRangetail = arrAllCate[tail];arrAllCate[tail] = arrAllCate[tail - 1];arrAllCate[tail - 1] = strRangetail;//交换次数加2nChangePosition +=2;}head += 2;tail -= 2;//循环次数加1++nCirCle;} while (head < tail);//每一趟的结果都输出出来cout << "第" << i + 1 << "趟结果:";for (int j = 0; j < ALL_CATE_NUM; ++j){cout << arrAllCate[j] << " ";}cout << endl << endl;}cout << "交换次数:" << nChangePosition << endl;cout << "循环次数:" << nCirCle << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{// 初始化棋子cout << "初始化棋子如下:";for (int i = 0; i < ALL_CATE_NUM; ++i){int nCount = i + 1;if (nCount % 2 == 0){arrAllCate[i] = "☆";}else{arrAllCate[i] = "★";}cout << arrAllCate[i] << " ";}cout << endl << endl;WayChange1();//WayChange2();system("pause");return 0;
}

五、实验结果及算法复杂度分析

(一)、生命游戏

1、实验结果

img

2 算法复杂度分析

时间复杂度: O ( 4 n 2 ) O(4n^2) O(4n2)

(二)、带锁的门
1、实验结果

img

2 算法复杂度分析
时间复杂度: O ( n 2 + 2 n ) O(n^2+2n) O(n2+2n)

(三)、三壶谜题
1、实验结果

img

2 算法复杂度分析
时间复杂度: O ( n 2 ) O(n^2) O(n2)
(四)、串匹配问题
1、实验结果

img

2 算法复杂度分析
最坏时间复杂度: O ( m ∗ n ) O(m*n) Omn
(五)、交替放置的碟子
1、实验结果

img

2 算法复杂度分析
时间复杂度:O(n(n+1)/2)

实验小结(包括问题和解决方法、心得体会等)

通过本次实验我对分治算法有了不错的掌握和更深的的了解,对其求解原理也有了实际解决的经验。分治算法就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。同时也对蛮力算法有了进一步的认识,它是一种简单直接地解决问题的方法,在有些情况下处理问题效率更高。

相关文章:

算法设计与分析实验报告c++实现(生命游戏、带锁的门、三壶谜题、串匹配问题、交替放置的碟子)

一、实验目的 1&#xff0e;加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、 编…...

【电子通识】热风枪的结构与使用方法

热风枪的结构 热风枪是专门用来拆焊、焊接贴片元器件和贴片集成电路的焊接工具&#xff0c;它主要由主机和热风焊枪两大部分构成。 热风枪主要有电源开关、风速设置、温度设置、热风连接等部件组成。根据不同品牌和价位的热风枪&#xff0c;有一些功能齐全的也集成了烙铁功能。…...

mysql知识点

MySQL 中有哪几种锁 表级锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;不会出现死锁&#xff1b;锁定粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。行级锁&#xff1a;开销大&#xff0c;加锁慢&#xff1b;会出现死锁&#xff1b;锁定粒度最小&…...

css Animation 动画-右进左出

transform: rotate&#xff08;旋转&#xff09; | scale&#xff08;缩放&#xff09; | skew&#xff08;倾斜&#xff09; | translate&#xff08;移动&#xff09; ;<style> .jinggao {width: 60vw;display: inline-block;text-align: center;overflow: hidden;box-…...

第十三届蓝桥杯省赛大学B组填空题(c++)

A.扫雷 暴力模拟AC: #include<iostream> using namespace std; const int N105; int n,m,map[N][N],ans[N][N]; int dx[8]{-1,-1,0,1,1,1,0,-1}; int dy[8]{0,1,1,1,0,-1,-1,-1}; int count(int x,int y){int cnt0;for(int i0;i<8;i){int xxxdx[i];int yyydy[i];if(…...

天星金融(原小米金融)深耕金融知识领域,助力消费者提升金融素养

近年来&#xff0c;依托生活和消费品质不断提升的时代契机&#xff0c;信用卡持卡人的数量以及信用卡消费的频率不断增加&#xff0c;信用卡还款问题也日益凸显。部分不法分子打着“智能还款”、“精养提额”的口号“踏浪”入场&#xff0c;实则行诱导、诈骗之实。天星金融&…...

中国手机频段介绍

中国目前有三大运营商&#xff0c;分别是中国移动、中国联通、中国电信&#xff0c;还有一个潜在的运营商中国广电&#xff0c;各家使用的2/3/4G的制式略有不同 中国移动的GSM包括900M和1800M两个频段。 中国移动的4G的TD-LTE包括B34、B38、B39、B40、B41几个频段&#xff0c;…...

企业如何使用SNP Glue将SAP与Snowflake集成?

SNP Glue是SNP的集成技术&#xff0c;适用于任何云平台。它最初是围绕SAP和Hadoop构建的&#xff0c;现在已经发展为一个集成平台&#xff0c;虽然它仍然非常专注SAP&#xff0c;但可以将几乎任何数据源与任何数据目标集成。 我们客户非常感兴趣的数据目标之一是Snowflake。Sno…...

算法设计与分析实验报告c++实现(最近点对问题、循环赛日程安排问题、排序问题、棋盘覆盖问题)

一、实验目的 1&#xff0e;加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、最…...

Vue - 你知道Vue中computed和watch的区别吗

难度级别:中高级及以上 提问概率:70% 二者都是用来监听数据变化的,而且在日常工作中大部分时候都只是局限于简单实用,所以到了面试中很难全面说出二者的区别。接下来我们看一下,二者究竟有哪些区别呢? 先说computed,它的主要用途是监听…...

POJ2976 Dropping tests——P4377 [USACO18OPEN] Talent Show G 【分数规划二分法+贪心/背包】

POJ2976 Dropping tests 【分数规划二分法+贪心】 有 n 个物品,每个物品有两个权值 a 和b。你可以放弃 k 个物品,选 n-k 个物品,使得最大。 输入多个样例,第一行输入n 和 k,第二行输入n 个 ai ,第三行输入 n 个 bi,输入 0 0 结束。 输出答案乘100 后四舍五入到整数…...

【生产实习-毕设】pyspark学生成绩分析与预测(上)

注意&#xff1a;数据由实习单位老师提供&#xff08;需要自行搜索下载&#xff09;&#xff0c;页面美化为下载模板。 项目介绍&#xff1a;前端页面输入影响成绩的属性&#xff0c;预测出成绩&#xff0c;并作可视化展示——属性对成绩的影响。使用python pyspark 进行数据预…...

【华为笔试题汇总】2024-04-10-华为春招笔试题(第二套)-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…...

Windows 文件夹被占用无法删除

按下键盘上的“Ctrl Alt Delete”键打开任务管理器...

PHP+MySQL组合开发 易企秀H5场景源码系统 带完整的安装代码包以及搭建教程

在数字化时代&#xff0c;企业对于宣传与推广的需求日益增长&#xff0c;而H5页面作为一种轻量级、跨平台的宣传方式&#xff0c;深受企业青睐。为了满足企业对于H5页面制作的需求&#xff0c;我们基于PHPMySQL组合开发了一套易企秀H5场景源码系统&#xff0c;并提供了完整的安…...

抖音小店入驻有什么条件?资金少,没经验的普通人做得起吗?

大家好&#xff0c;我是电商花花。 在直播电商的推动下&#xff0c;抖音小店独特的电商模式下吸引着众多的商家&#xff0c;吸引着一波又一波的创业者入驻&#xff0c;想要在抖音小店上开垦出属于自己的电商净土。 想要入驻抖音小店还需要一些条件&#xff0c;然后才能入驻成…...

游戏行业科普 (二)游戏是怎么做出来,怎么卖出去的?

游戏行业科普系列文章&#xff0c;大家可以关注起来&#xff0c;等我慢慢芬分享~~ 《蛋仔派对》 一、研运流程--游戏是怎么做出来的 一款游戏的开发和运营大体上可以分为预研立项、设计开发、测试调优、发行上线和成熟运营几个阶段。 1&#xff09;预研立项&#xff1a; 初始研…...

Java研学-RBAC权限控制(二)

三 PageHelper 1 分页所需 // 原分页所需 1. 定义QueryObject类&#xff0c;传递分页参数&#xff0c;currentPage&#xff0c;pageSize&#xff0c;get start();方法 2. selectForCount()方法&#xff0c;总条数小于等于0说明不需要分页&#xff0c;大于0说明可以分页 3. se…...

20. 【Android教程】拖动条 SeekBar

这一节要学的控件是 ProgressBar 的升级版&#xff0c;对于 ProgressBar 而言只能展示进度&#xff0c;而不能与用户互动&#xff0c;也就是没有接收用户输入的能力。而本节要学习的 SeekBar 是一种可以“Seek”的 ProgressBar&#xff0c;用户不但可以通过 SeekBar 观察到进度…...

工业物联网网关在机械设备制造企业数转过程的应用-天拓四方

随着科技的飞速发展&#xff0c;物联网技术已经渗透到工业领域的每一个角落。作为连接物理世界和数字世界的桥梁&#xff0c;工业物联网网关在推动企业数字化转型中发挥着至关重要的作用。数字化转型已经成为企业提升竞争力的必由之路&#xff0c;然而&#xff0c;在转型过程中…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...