算法设计与分析学习笔记03 | 8月更文挑战

209 阅读3分钟

这是我参与8月更文挑战的第3天,活动详情查看: 8月更文挑战

算法设计与分析题目1: 袋子里,当所有球的号码和>所有球的号码积,这是一个幸运袋子

可以移除掉一些球,但不能全部移除,使得移除后的袋子是幸运的

输入:

(1)n个球

(2)n个球的号码:a1 a2 ... an

输出:

可以产生的幸运袋子数

核心代码及注释:


假如球状态为:1 1 1 2 2 3

(1)从1号球开始

(2)store状态依次为:

1

1 2

1 2 3

1 2 2

1 2 2 3

1 1

1 1 2

1 1 2 2
1 1 2 2 3

1 1 1

1 1 1 2

1 1 1 2 2

1 1 1 2 2 3

2

2 2

2 2 3

3

/* step:进入store球的个数,local:当前遍历几号球 */

void dfs(int step, int local) {

 

if (step > n) return;

 

/* 当store中球的个数>=2,就可以开始判断幸运袋了 */

if (step >= 2) {

int sum = 0;

int mul = 0;

for (int i = 0; i < step; i++) {

sum += store[i];//求和

mul *= store[i];//求积

}

 

if (sum > mul)

num++;

else

return;

}

 

/* 从local号球开始遍历,若该号球没有个数=0,则跳过 */

for (int i = local; i < N; i++) {

/* 遍历当前号球的所有个数 */

for (int j = 1; j <= arr[i]; j++) {

/* 逐个将[当前球号的][球][的j限定个数]添加到store */

for (int k = 0; k < j; k++) {

store[step + k] = i;

}

/* step + j:将当前store的个数传入下次dfs,local + 1:从local + 1号球开始 */

dfs(step + j, local + 1);

}

}

}

测试结果:

输入:

图片1.png

输出:

图片2.png

算法设计与分析题目2: 只有相邻的动物可以通信

  输入:

n:动物数量0...n-1;m:可以相互通信的动物对数

下面m行:代表2种动物可以相互通信

k:查询多少对

每个查找包含2个数字(动物)

输出:

2个动物之间至少需要多少个翻译(最短路径)

-1:不存在翻译

核心代码及注释:


int BFS(int x, int y) {

 

/* 如果相邻直接返回 */

if (G[x][y] != -1) return G[x][y];

 

/* 初始化数据 */

for (int i = 0; i < n; i++) {

flag[i] = 0;

queue[i][1] = 0x7fffffff;//初始化翻译距离=无穷

}

flag[x] = 1;//访问x
int head = 0;

int tail = 0;

for (int i = 0; i < n; i++) {

/* 找出所有与x相邻的点,入队 */

if (i != x && G[x][i] != -1) {

queue[tail][0] = i;//第一列保存与x相邻的点

queue[tail][1] = 0;//第二列保存与x的翻译距离

flag[i] = 1;

tail++;

}

}

 

while (head != tail) {

for (int i = 0; i < n; i++) {

/* 寻找未被访问的点 且 队头元素与这个未被访问的点相邻 */

if (!flag[i] && G[queue[head][0]][i] != -1) {

int temp = queue[head][1] + 1;//累计路程

 

/* 如果寻找的这个点恰恰是y,直接返回 */

if (i == y) return temp;

 

/* 否则,将这个点入队,并记录与x的距离 */

queue[tail][0] = i;

queue[tail][1] = temp;

flag[i] = 1;

tail++;

}

}

head++;

}

return -1;

}

测试结果:

输入:

3 2

0 1

1 2

2

0 0

0 2

输出:

图片3.png