第三章 枚举(炸弹人、火柴棍等式、全排列)

目描述(ID:12033)

 

标题: 炸弹人
详情: 小哼最近爱上了“炸弹人”游戏。你还记得在小霸王游戏机上的炸弹人吗?用放置炸弹的方法来消灭敌人。需将画面上的敌人全部消灭后,并找到隐藏在墙里的暗门才能过关。
 第三章 枚举(炸弹人、火柴棍等式、全排列)_第1张图片

 

 
  现在有一个特殊的关卡如下。你只有一枚炸弹,但是这枚炸弹威力超强(杀伤距离超长,可以消灭杀伤范围内所有的敌人)。请问在哪里放置炸弹才可以消灭最多的敌人呢。

 第三章 枚举(炸弹人、火柴棍等式、全排列)_第2张图片
我们先将这个地图模型化。墙用 # 表示。这里有两种墙,一种是可以被炸掉的,另外一种是不能被炸掉的。但是由于现在只有一枚炸弹,所以都用 # 表示,炸弹是不能穿墙的。敌人用 G 表示,空地用 . 表示,当然炸弹只能放在空地上。
输入格式:
第一行4个整数为n m 表示迷宫的行和列,接下来的n行m列为地图。
1<=n,m<=50
输出格式:
输出做最多可以消灭的敌人数
样例:

输入

13 13
#############
#GG.GGG#GGG.#
###.#G#G#G#G#
#.......#..G#
#G#.###.#G#G#
#GG.GGG.#.GG#
#G#.#G#.#.###
##G...G.....#
#G#.#G###.#G#
#...G#GGG.GG#
#G#.#G#G#.#G#
#GG.GGG#G.GG#
#############

输出

8
 1 #include 
 2 int main()
 3 {
 4     int n, m, max, maxi, maxj, i, j,k, total;
 5     char a[20][20];
 6     scanf("%d%d",&n,&m);
 7     getchar();
 8     for (i = 0;i < n;i++)
 9         gets(a[i]);
10     max = 0;
11     for (i = 0;i < n;i++)
12     {
13         for (j = 0;j < m;j++)
14         {
15             if (a[i][j] == '.')
16             {
17                 total = 0;
18                 k = i - 1;
19                 while (k >= 0 && a[k][j] != '#')
20                 {
21                     if (a[k][j] == 'G')
22                         total++;
23                     k--;
24                 }
25                 k = i + 1;
26                 while (k < n && a[k][j] != '#')
27                 {
28                     if (a[k][j] == 'G')
29                         total++;
30                     k++;
31                 }
32                 k = j + 1;
33                 while (k < m && a[i][k] != '#')
34                 {
35                     if (a[i][k] == 'G')
36                         total++;
37                     k++;
38                 }
39                 k = j - 1;
40                 while (k >=0 && a[i][k] != '#')
41                 {
42                     if (a[i][k] == 'G')
43                         total++;
44                     k--;
45                 }
46             }
47             if (total > max)
48             {
49                 maxi = i;
50                 maxj = j;
51                 max = total;
52             }
53         }
54     }
55     printf("max= %d,maxi= %d,maxj= %d\n",max,maxi,maxj);
56     return 0;
57 }
View Code

 

火柴棍等式

给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:

注意:
1. 加号与等号各自需要两根火柴棍
2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
3. n根火柴棍必须全部用上

 样例:

  输入 14  输出  2  等式为0+1=1 和1+0=1

  输入 18  输出  9  等式为0+4=4 0+11=11 1+10=11 2+2=4 2+7=9 4+0=4 7+2=9 10+1=11 11+0=11

 1 #include 
 2 int fun(int n)
 3 {
 4     int total = 0;
 5     int f[10] = {6,2,5,5,4,5,6,3,7,6};
 6     if (n == 0)
 7         total = f[0];
 8     while (n)
 9     {
10         total += f[n % 10];
11         n /= 10;
12     }
13     return total;
14 }
15 int main()
16 {
17     int a, b, c, m, sum=0;
18     scanf("%d",&m);
19     for (a = 0;a <= 11111;a++)
20     {
21         for (b = 0;b < 11111;b++)
22         {
23             c = a + b;
24             if (fun(a) + fun(c) + fun(b) == m-4)
25             {
26                 printf("%d+%d=%d\n",a,b,c);
27                 sum++;
28             }
29         }
30     }
31     printf("sum=%d\n",sum);
32     return 0;
33 }
View Code

 

转载于:https://www.cnblogs.com/naglish/p/6928645.html

你可能感兴趣的:(第三章 枚举(炸弹人、火柴棍等式、全排列))