您的位置:首页 > 其它

zoj2100(DFS)

2011-04-24 00:22 267 查看
这个题呀,题意很简单,能把所有的地种完就是胜利

令我纠结的是回溯的问题,这个一直不是很明白是怎么执行的,还是自己比较水呀。。。

dfs(-1,0,0);中不能从(0,0)开始,高手云:这样不能保证从(0,0)开始回溯

]#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
int N,K,num,fienum ;
int visit[10][10];
char field[10][10];
int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}};

void dfs(int x,int y)
{

int xx,yy,i;
for(i = 0;i < 4;i++)
{
xx = x + dir[i][0];
yy = y + dir[i][1];
if(xx >= 0 && xx < N && yy >= 0 && yy < K)
{
if(!visit[xx][yy] && field[xx][yy] != 'S')
{
num ++;
visit[xx][yy] = 1;
dfs(xx,yy);
if((fienum + num) == (N * K)) return ;
visit[xx][yy] = 0;
num --;
}
}
}

}

int main()
{

int i ,j ;

while(scanf("%d%d",&N,&K) && N + K)
{

for(i = 0;i < N;i++)
scanf("%s",field[i]);
getchar();
num = 0;
memset(visit,0,sizeof(visit));

fienum = 0;
for(i = 0;i < N;i++)
for(j = 0;j < K;j++)
if(field[i][j] == 'S') fienum ++;
dfs(0,0);
/*printf("%d %d ",fienum,num);*/
if((num + fienum) == (N * K)) printf("YES/n");
else printf("NO/n");
}

return 0;
}
2011-04-24 00:20:09
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: