枚举法的应用

枚举法的应用——炸弹人小游戏

  1 #include <iostream>
  2
  3 #define H 20    //地图行上限
  4 #define L 21    //地图列上限
  5
  6 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  7
  8 void BackUp(char map[][L],int n,int m,char backUpMap[][L])    //将map中的地图备份到backUpMap中
  9 {
 10     for(int i=0;i<n;i++)
 11     {
 12         for(int j=0;j<=m;j++)
 13         {
 14             backUpMap[i][j]=map[i][j];
 15         }
 16     }
 17 }
 18
 19 void Bomb(char map[][L],int n,int m,int a,int b)    //根据炸弹的位置改造地图
 20 {
 21     if(map[a][b]==‘.‘)
 22     {
 23         int sum=0;
 24         int y=a;
 25         int x=b;
 26         while(map[y][x]!=‘#‘&&y<n)    //向上统计
 27         {
 28             if(map[y][x]!=‘.‘)
 29             {
 30                 map[y][x]=‘.‘;
 31             }
 32             ++y;
 33         }
 34         y=a;    //归位
 35         x=b;
 36         while(map[y][x]!=‘#‘&&y>=0)    //向下统计
 37         {
 38             if(map[y][x]!=‘.‘)
 39             {
 40                 map[y][x]=‘.‘;
 41             }
 42             --y;
 43         }
 44         y=a;
 45         x=b;
 46         while(map[y][x]!=‘#‘&&x>=0)    //向左统计
 47         {
 48             if(map[y][x]!=‘.‘)
 49             {
 50                 map[y][x]=‘.‘;
 51             }
 52             --x;
 53         }
 54         y=a;
 55         x=b;
 56         while(map[y][x]!=‘#‘&&x<m)    //向右统计
 57         {
 58             if(map[y][x]!=‘.‘)
 59             {
 60                 map[y][x]=‘.‘;
 61             }
 62             ++x;
 63         }
 64         printf("炸弹爆炸后:\n");
 65         for(int i=0;i<n;i++)
 66         {
 67             printf("%s\n",map[i]);
 68         }
 69     }
 70 }
 71
 72 int Analyse(char map[][L],int n,int m,int i,int j)    //分析炸弹爆炸将造成的伤害
 73 {
 74     if(map[i][j]==‘.‘)
 75     {
 76         int sum=0;
 77         int y=i;
 78         int x=j;
 79         while(map[y][x]!=‘#‘&&y<n)    //向上统计
 80         {
 81             if(map[y][x]!=‘.‘)
 82             {
 83                 ++sum;
 84             }
 85             ++y;
 86         }
 87         y=i;    //归位
 88         x=j;
 89         while(map[y][x]!=‘#‘&&y>=0)    //向下统计
 90         {
 91             if(map[y][x]!=‘.‘)
 92             {
 93                 ++sum;
 94             }
 95             --y;
 96         }
 97         y=i;
 98         x=j;
 99         while(map[y][x]!=‘#‘&&x>=0)    //向左统计
100         {
101             if(map[y][x]!=‘.‘)
102             {
103                 ++sum;
104             }
105             --x;
106         }
107         y=i;
108         x=j;
109         while(map[y][x]!=‘#‘&&x<m)    //向右统计
110         {
111             if(map[y][x]!=‘.‘)
112             {
113                 ++sum;
114             }
115             ++x;
116         }
117         return sum;
118     }
119     return 0;
120 }
121
122 void SearchBest(char map[][L],int n,int m)    //查找最优位置
123 {
124     int p=0;
125     int q=0;
126     int max=0;
127     for(int i=0;i<n;i++)
128     {
129         for(int j=0;j<m;j++)
130         {
131             int sum=Analyse(map,n,m,i,j);
132             if(sum>max)
133             {
134                 max=sum;
135                 p=i;
136                 q=j;
137             }
138         }
139     }
140     printf("最佳位置为(%d,%d):\n",p,q);
141     Bomb(map,n,m,p,q);
142     printf("共炸死%d个敌人\n",max);
143 }
144
145 int main(int argc, char** argv) {
146     char map[H][L];        //地图大小不超过H*L
147     int n,m,a,b;    //n代表行数,m代表列数 //a,b代表放炸弹的位置
148     printf("请输入行数和列数:");
149     scanf("%d%d",&n,&m);
150     printf("请创建一个%d行%d列的地图:\n",n,m);
151     for(int i=0;i<n;i++)    //读入地图
152     {
153         scanf("%s",&map[i]);
154     }
155     printf("您创建的地图如下:\n");
156     for(int i=0;i<n;i++)
157     {
158         printf("%s\n",map[i]);
159     }
160     char backUpMap[H][L];
161     BackUp(map,n,m,backUpMap);
162     printf("请输入您要放炸弹的位置(a,b):");
163     scanf("%d%d",&a,&b);
164     int sum=Analyse(map,n,m,a,b);
165     Bomb(map,n,m,a,b);
166     printf("共炸死%d个敌人\n",sum);
167     printf("\n-----------------------------\n");
168     SearchBest(backUpMap,n,m);
169     return 0;
170 }
时间: 2024-10-09 21:44:17

枚举法的应用的相关文章

枚举法判断某天是否为2015年节假日或周末

枚举法判断某天是否为2015年节假日或周末 1.节假日枚举类 /** *功能说明:节假日枚举类 * *创建人:Gansuper * *创建时间:2015-2-6 上午10:32:17 * *修改人 修改时间 修改描述 * */ public enum HolidayEnum { HOLIDAY(new String[]{"2015-01-01","2015-01-02","2015-01-03", "2015-02-18",&

八皇后问题(回溯法&amp;枚举法)

作者 : 卿笃军 本文讨论了八皇后问题的三种解决方案: 一.枚举法 二.回溯法(递归版) 三.回溯法(非递归版) 本来这些代码是以前编写好的,没有发表,由于最近又学习到了八皇后问题,自己整理了一下发表了出来! 首先.说明一下何为八皇后问题,我也不去谷歌了,直接简单的说明一下: 八皇后问题,就是在一个8*8的平面棋盘上,要求你摆放8个棋子,要求:这8个棋子不能有2个在同一行,也不能有2个在同一列,同时一条斜线上面也不能有2个~~~~ 比如:4*4的棋盘,你可以这样摆放(4皇后问题): 以上图为参照

【算法学习笔记】28.枚举法 解题报告 SJTU_OJ 1255 1256 魔戒

1256. 你的魔戒?不,是你的魔戒.加强版 Description 在前往末日火山的途中,佛罗多与他的霍比特人同胞不幸被半兽人抓住了.半兽人要对每个霍比特人进行询问,以找出哪个霍比特人携带了至尊魔戒.每个霍比特人可能会说以下几种话: I have the ring. 我有魔戒. I have not the ring. 我没有魔戒. XXX has the ring. XXX有魔戒.(XXX表示某个霍比特人的名字) XXX has not the ring. XXX没有魔戒. Today is

枚举法的简单应用

箱子里有红,黄,蓝,白,黑五种颜色玻璃球若干,每次任意拿出三个球,问拿出三种不同颜色玻璃球的可能取法,请输出每种排列的情况. 注解:利用枚举法定义五种情况,“enum color {red,yellow,blue,white,black};”,定义四个整形变量“int i,j,k,m=0;”,依次从i到k分别进行从红到黑的情况循环,利用if来决断i,j,k互不相等的情况,针对每种情况通过调用函数来进行输出转换,得到结果. 编程: #include <iostream>using namespa

暴力枚举法总结

集训快要结束了,按照要求需要写一篇关于枚举的总结,于是在网上也看了许多其他菊苣写的文章,深受启发,但是思来想去感觉又不太系统,于是希望能在吸收那些知识后做一些整理,帮助后面的新人. 枚举的基本方法: 枚举,枚举,顾名思义,就是将所有情况都举出,并判断其是否符合题目条件.所以枚举的基本方法便是分析题意后,找到一个合适的维度列举每一个元素,以完成题目.其中如何找到一个合适的维度来进行枚举便是其中的最大难点. 枚举的基本条件: 首先是时间条件.一般来说主流的OJ当中,1000ms的时间限制下可以运行操

【算法学习笔记】64. 枚举法 SJTU OJ 1381 畅畅的牙签

枚举法就好了,推理很麻烦,感觉也做不出来. 创造一个结构体,一个是真实的数,一个是花费的牙签数. 构建一位数,两位数,三位数即可. #include <iostream> #include <vector> using namespace std; //从0到9耗费的牙签数 int cost[10]={6,2,5,5,4,5,6,3,7,6}; struct num { int n;//用于计算的数 int c;//耗费的牙签 }; num v[100000]; int main(

算法设计——枚举法

算法上机课,要我们用枚举法求解. 1. 由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数. 我用的是C语言,visualC++编写的 #include<stdio.h> int main() { int i,j,k,m,n; int count=0; for(i=1;i<=4;i++){ for(j=0;j<=4;j++){ if(j==i) continue; for(k=0;k<=4;k++){ if(k==3|

基础算法之二——枚举法

基础算法之二--枚举法"赛利的硬币" 题目描述 赛利有 12枚银币.其中有 11枚真币和1枚假币.假币看起来和真币没有区别,但是重量不同.但赛利不知道假币比真币轻还是重.于是他向朋友借了一架天平.朋友希望赛利称三次就能找出假币并且确定假币是轻是重.例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的.如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币.经过精心安排每次的称量,赛利保证在称三次后确定假币. 输入数据 输入有三行,每行表示一次称量的结果.赛利事先

for循环枚举法,全排列+dfs,补充浮点数注意事项

其实这个题目我一直没想好应该叫什么,就是在做蓝桥杯的时候会遇到很多的题,给你一等式,abcdef...分别是1-9(||12||15)不重复问你有几种方案? 我之前一直都是用的for循环在做,听说这叫什么暴力破解还是枚举法的.小白不是很懂这些. 但是之前做过一道题,好像就是15个数的for循环写的,一个是巨累(因为我用a!=b&&a!=c&&a!=....真的特别多而且容易写错),另一个是我记得我这道题写了很久最后提交没有分数,因为!!!超时了!!! 真的特别气,当时的我只