枚举算法

mac2024-10-06  64

枚举算法的基本思想:有序地去尝试每一种可能

炸弹人 基本就是把每一个点都遍历一遍 然后判断 就是最简单的枚举 全部枚举

//炸弹人的策略 #include<stdio.h> int main() { char a[20][21]; int i, j, sum, map = 0, p, q, x, y, n, m; scanf("%d%d", &n, &m); for (i = 0; i < n; i++) //输入地图 scanf("%s", a[i]); for (i = 0; i < n; i++) //遍历地图中的每一个点 { for (j = 0; j < m; j++) { if (a[i][j] == '.') //如果是空地 { sum = 0; x = i; y = j; while (a[x][y] != '#') //如果没有到达不可摧毁的墙 { if (a[x][y] == 'G') //如果是敌人 sum++; x--; //向上遍历 } x = i; y = j; while (a[x][y] != '#') { if (a[x][y] == 'G') sum++; x++; } x = i; y = j; while (a[x][y] != '#') { if (a[x][y] == 'G') sum++; y--; } x = i; y = j; while (a[x][y] != '#') { if (a[x][y] == 'G') sum++; y++; } if (sum > map) //如果摧毁的敌人更多 { map = sum; p = i; //记录这个最多的点的横纵坐标 q = j; } } } } printf("将炸弹放置在 (%d, %d) ,最多可以消灭 %d 个敌人\n", p, q, map); return 0; }

火柴棍

#include<stdio.h> int gen(int i) { int a[10] = { 6,2,5,5,4,5,6,3,7,6 }; int sum = 0; /*while (i != 0) { sum += a[i % 10]; i /= 10; }*/ //为什么这个不行呢? //因为,如果i直接等于0呢?那么就会出现错了,不能进入while里面 //而直接返回了sum=0。导致出现错误 while (i / 10 != 0) { sum += a[i % 10]; i = i / 10; } sum += a[i]; return sum; } int main() { int count, n; scanf("%d", &n); count = 0; for (int i = 0; i <= 1111; i++) { for (int j = 0; j <= 1111; j++) { if (gen(i) + gen(j) + gen(i+j) == (n - 4)) { count++; } } } printf("%d", count); return 0; }

数的全排列 基本上就是枚举每一种可能性 没有什么难处

对于123的全排列

for (i = 1; i <= 3; i++) { for (j = 1; j <= 3; j++) { for (k = 1; k <= 3; k++) { if (i != j && j != k && i != k &&) printf("%d%d%d\n", i, j, k); } } }

对于1234的全排列

for (i = 1; i <= 4; i++) { for (j = 1; j <= 4; j++) { for (k = 1; k <= 4; k++) { for (l = 1; l <= 4; l++) { if (i != j && j != k && k != l && i != k && i != l && j != l) printf("%d%d%d\n", i, j, k, l); } } } }

总结

枚举就是考虑每一种可能的发生 然后对于这每一种可能判断是否可行。如果可行,则进行操作。如果不可行,则continue

最新回复(0)