您的位置:首页 > 其它

zoj 2100 Seeding(DFS水水~)

2010-10-14 18:41 429 查看
激动啊激动啊无比激动啊!!!



可以说是第一道自己完全写的DFS。。。。激动!!!哈哈~~



在物理课上把代码写了写,敲的时候,有些地方还是有点问题的,又想了会,终于摆脱递归+回溯噩梦了。。。。/(^o^)/



专门找的DFS水题。。。因为我一遇到DFS就晕。。。理解不了,今天终于理解好了~~我太伟大了,哈哈哈哈哈哈哈哈哈哈~~



去上选修课去~~偶也~~~



深搜 还是用4个方向去搜索,直接把有石头的地方标记为已走过就OK~~



#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int visit[8][8];
int n,m,ok;
int dir[8] = {1,0,-1,0,0,1,0,-1};
void input()
{
	char x;
	ok = 0;
	for(int i=1; i<=n; i++)
	{
		for(int k=1; k<=m; k++)
		{
			scanf("%c",&x);
			switch(x)
			{
				case '.': visit[i][k] = 0; break;
				case 'S': visit[i][k] = 1; break;
			}
		}
		getchar();
	}
}
int traverse()
{
	for(int i=1; i<=n; i++)
		for(int j=1; j<=m; j++)
			if( !visit[i][j] )
				return 0;
	return 1;
}
void DFS(int i,int j)
{
	visit[i][j] = 1;
	if( traverse() )
	{
		ok = 1;
		return ;
	}
	for(int k=0; k<8; k+=2)
	{
		int a = i + dir[k];
		int b = j + dir[k+1];
		if( a>=1 && a<=n && b>=1 && b<=m && !visit[a][b] )
			DFS(a,b);
	}
	if( !ok )
		visit[i][j] = 0;
	return ;
}
int main(void)
{
	while( scanf("%d %d",&n,&m)!=EOF && n)
	{
		getchar();
		input();
		DFS(1,1);
		ok == 1 ? printf("YES/n") : printf("NO/n");
	}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: