您的位置:首页 > 其它

第二道简单深搜DFS-------------lig1143

2012-03-03 08:59 211 查看
说起lig1143这道题,大有渊源,光代码都编了5次,可谓一波三折。早在这道题出来时,我就试图去做。但那时还不会DFS,无从下手。想用栈解决,又太麻烦了!

终于在掌握深搜之后,AC了。这道题不用任何剪枝,最基础的。可以说,是我第一道自己写出来的。

本想现在写一下,对深搜,广搜的理解。算了,等多算几道题之后再写感悟吧!

AC代码,以后多看看,加深理解:

#include<stdio.h>
#include<string.h>
int map[1002][1002]; //用来记录高度
int map1[1002][1002]; //用来标记。初始化为0, 0表示没有走过,走过之后都标记为1
int n,m,sum;

int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; //这点很先进,以后要多利用
void dfs(int si,int sj,int max) //深搜
{
int i;
if(si>n||si<=0||sj>m||sj<=0)
return ;
for(i=0;i<4;i++)
{
if(map[si+dir[i][0]][sj+dir[i][1]]<=max&&map1[si+dir[i][0]][sj+dir[i][1]]==0)//如果这个点可通,且没有被走过。则,加上它,并标记
{
//printf("[%d %d]----->",si+dir[i][0],sj+dir[i][1]);
sum++;
map1[si+dir[i][0]][sj+dir[i][1]]=1;
dfs(si+dir[i][0],sj+dir[i][1],max);
}
}
return ;
}
int main()
{
int i,j,p1,p2,max;
while(scanf("%d%d%d%d",&n,&m,&p1,&p2)!=EOF)
{
memset(map1,1,sizeof(map1)); //这个地方,改了好多次,一定要处理好边界
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
map1[i][j]=0;
if(i==p1&&j==p2) max=map[i][j];
}
}
sum=0;
sum++; //表示从第一个坐标(即泉眼)开始
map1[p1][p2]=1; //标记泉眼
dfs(p1,p2,max);
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: