枚举算法的基本思想:有序地去尝试每一种可能
炸弹人
基本就是把每一个点都遍历一遍
然后判断
就是最简单的枚举
全部枚举
//炸弹人的策略
#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