标签:深搜
先来说说题目意思吧,如图,帮助小人找到一个放炸弹的坐标,使之一颗炸弹炸死最多的敌人。
我们用字符G表示敌人,#表示墙, . 表示可以走的路,特别说明下,那种一推就倒的墙,就把它看做路吧。
下面就来搜索来一下吧:
/*
来让我们小小的说明下深搜的要点:
1、解决当前任务是什么。
2、什么时候我该休息。
3、当前任务做完了,下一步怎么做。
怎么样很好理解的吧
*/
#include<stdio.h>
#include<string.h>
char map[20][20];//存储图
int mark[20][20];//标志图中的位置是否到达过
int m,n;//m行n列的图
int ex,ey;//需要的出的坐标
int max;
//位于(x,y)坐标是应该怎么处理,这里的x,y表示的是第x行,第y列
void DFS(int x,int y){
/*
*这个时候该结束了,可以休息了
*
*当前位置可不能是图的外部 ,当然走过了耶不用走了
*/
if(x>=m || x<1 || y>=n || y<1 || mark[x][y] || map[x][y]==‘G‘ || map[x][y]==‘#‘){
return ;
}
/*
*当前我的任务是这个,统计我能消灭的敌人
*
*从这里向下可以写为一个函数
*/
int sum=0;
int tx,ty;
tx = x,ty=y;
while(map[tx][ty]!=‘#‘){
//统计当前位置以上敌人数量
if(map[tx][ty]==‘G‘){
sum++;
}
tx++;
}
tx=x;ty=y;
while(map[tx][ty]!=‘#‘){
//统计当前位置以下的敌人
if(map[tx][ty]==‘G‘){
sum++;
}
tx--;
}
tx=x;ty=y;
while(map[tx][ty]!=‘#‘){
//统计当前位置左边的敌人
if(map[tx][ty]==‘G‘){
sum++;
}
ty--;
}
tx=x;ty=y;
while(map[tx][ty]!=‘#‘){
//统计当前位置左边的敌人
if(map[tx][ty]==‘G‘){
sum++;
}
ty++;
}
/*从这里向上可以写为一个函数*/
//更新最大值
if(sum>max){
max = sum;
ex = x;
ey = y;
}
mark[x][y]=1;//这个点走过了,就不要了
/*
*当前任务做完了,我可以接下一个任务了
*下一步可以上下左右的选择一下
*/
DFS(x+1,y);
DFS(x-1,y);
DFS(x,y-1);
DFS(x,y+1);
return ;
}
int main(){
memset(mark,0,sizeof(mark));
max=0;
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++){
scanf("%s",map[i]);
}
DFS(2,3);//假设从2,3出发
printf("最佳坐标:(%d,%d),可以干掉敌人%d个!",ex,ey,max);
return 0;
}
/*
***测试数据:
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#
#############
*/
上面的看懂了没呢,倒杯茶,静心想一想。
标签:深搜
原文地址:http://blog.csdn.net/u012437355/article/details/45227645