啊哈算法搜索应用之再解炸弹人(DFS与BFS)
2016-10-04 15:10
495 查看
//广搜 #include <stdio.h> #include <stdlib.h> #include <string.h> struct node{//存此点的坐标,消灭敌人数 int x; int y; int sum; }; struct node queue[20];//队列实现BFS int head=0; int tail=0; char map[21][21];//存图 int book[21][21];//标记走过的点 int n;//图的规模 int max=-1;//消灭敌人最多的数量 int xmax,ymax;//消灭敌人最多数量的坐标 int next[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; int getsum(int x,int y)//得到此点放炸弹消灭的敌人数 { int i,j; int sum=0; //向上统计 i=x-1; j=y; while(map[i][j]!='#'){ if(map[i][j]=='G') sum++; i--; } //向下统计 i=x+1; j=y; while(map[i][j]!='#'){ if(map[i][j]=='G') sum++; i++; } //向左统计 i=x; j=y-1; while(map[i][j]!='#'){ if(map[i][j]=='G') sum++; j--; } //向右统计 i=x; j=y+1; while(map[i][j]!='#'){ if(map[i][j]=='G') sum++; j++; } return sum; } void bfs(int x,int y) { if(head>=tail) return; int xnext; int ynext; for(int i=0;i<4;i++){ xnext=next[i][0]+x; ynext=next[i][1]+y; if(map[xnext][ynext]=='.'&&book[xnext][ynext]==0){ book[xnext][ynext]=1; queue[tail].x=xnext; queue[tail].y=ynext; queue[tail].sum=getsum(xnext,ynext); if(queue[tail].sum>max){ max=queue[tail].sum; xmax=xnext; ymax=ynext; } tail++; } } head++; bfs(queue[head].x,queue[head].y); } int main() { scanf("%d",&n); getchar(); for(int i=0;i<n;i++) gets(map[i]); for(int i=0;i<=20;i++) memset(book[i],0,sizeof(book[i])); //假设炸弹人开始在(1,1) queue[tail].x=1; queue[tail].y=1; queue[tail].sum=getsum(1,1); book[1][1]=1; max=queue[tail].sum; xmax=1; ymax=1; tail++; bfs(1,1); printf("(%d,%d) %d\n",xmax,ymax,max); return 0; }
//深搜 #include <stdio.h> #include <stdlib.h> #include <string.h> struct node{//存此点的坐标,消灭敌人数 int x; int y; int sum; }; char map[21][21];//存图 int book[21][21];//标记走过的点 int n;//图的规模 int next[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; int max=-1;//消灭敌人最多的数量 int xmax,ymax;//消灭敌人最多数量的坐标 int getsum(int x,int y)//得到此点放炸弹消灭的敌人数 { int i,j; int sum=0; //向上统计 i=x-1; j=y; while(map[i][j]!='#'){ if(map[i][j]=='G') sum++; i--; } //向下统计 i=x+1; j=y; while(map[i][j]!='#'){ if(map[i][j]=='G') sum++; i++; } //向左统计 i=x; j=y-1; while(map[i][j]!='#'){ if(map[i][j]=='G') sum++; j--; } //向右统计 i=x; j=y+1; while(map[i][j]!='#'){ if(map[i][j]=='G') sum++; j++; } return sum; } void dfs(int x,int y) { int xnext,ynext; for(int i=0;i<4;i++){ xnext=x+next[i][0]; ynext=y+next[i][1]; if(map[xnext][ynext]=='.'&&book[xnext][ynext]==0){ book[xnext][ynext]=1; int sum=getsum(xnext,ynext); if(sum>max){ xmax=xnext; ymax=ynext; max=sum; } dfs(xnext,ynext); //book[xnext][ynext]=0; //深搜不一定有此句,根据需求定 } } return; } int main() { scanf("%d",&n); getchar(); for(int i=0;i<21;i++) memset(book[i],0,sizeof(book[i])); //读入图 for(int i=0;i<n;i++) gets(map[i]); book[1][1]=1; xmax=1; ymax=1; max=getsum(1,1); dfs(1,1); printf("(%d,%d) %d\n",xmax,ymax,max); return 0; }
相关文章推荐
- 啊哈算法搜索应用之宝岛探险(BFS和DFS)
- 算法总结(12)--dfs, bfs记忆化, 减少不必要的搜索
- 【算法——02】图的遍历——BFS广度优先搜索、DFS深度优先搜索
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- BFS和DFS优先搜索算法
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- 深度优先搜索DFS/广度优先搜索BFS的一个应用实例(华为编程大赛赛题)
- 经典算法研究系列:四、教你通透彻底理解:BFS和DFS优先搜索算法
- 图算法(一)——基本图算法(BFS,DFS及其应用)(1)
- 图算法(一)——基本图算法(BFS,DFS及其应用)(2)
- 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- POJ 3083 Children of the Candy Corn DFS及BFS搜索
- BFS和DFS算法分析对比及优化
- 经典算法研究系列:四、教你通透彻底理解:BFS和DFS优先搜索算法
- 一之续、A*,Dijkstra,BFS算法性能比较及A*算法的应用
- DFS深度搜索算法实现深度探究解析-以POJ 1040为例
- POJ 3083 Children of the Candy Corn DFS及BFS搜索
- POJ 3083 Children of the Candy Corn DFS及BFS搜索
- 一之续、A*,Dijkstra,BFS算法性能比较及A*算法的应用