这是我参与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);
}
}
}
测试结果:
输入:
输出:
算法设计与分析题目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
输出: