zoj 2165||poj 1979 red and black (dfs)

题意:


人只能走黑色的瓷砖,求能走的最多瓷砖数

。:表示黑色的瓷砖

#  :表示红色的瓷砖

@ :表示man


分析:

油田问题http://blog.csdn.net/cqlf__/article/details/6982693的简化版,真心简单的dfs,一次ac,哈哈。对于dfs是第一次啊。需要注意的问题是输入的数字第一个表示列第二个才是表示行,表示搞错一次。

下午做了2道,还有一个1649稍微难点,我用dfs写的在hdoj上过了,但是zoj上却悲剧的卡时间了。唉,下周做bfs吧,再去解决他。。。。>_<

#include<stdio.h>
int n,m,count;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char a[25][25];
int main()
{
	void dfs(int x,int y);
	int i,j;
	int start_x,start_y;
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		count=1;
		if(n==0&&m==0) break;
		for(i=0;i<=n+1;i++)
		{
			a[i][0]='#';
			a[i][m+1]='#';
		}
		for(j=0;j<=m+1;j++)
		{
			a[0][j]='#';
			a[n+1][j]='#';
		}
		for(i=1;i<=n;i++)
		{
			getchar();
			for(j=1;j<=m;j++)
			{
				scanf("%c",&a[i][j]);
				if(a[i][j]=='@')
				{
					start_x=i;
					start_y=j;
				}
			}
		}
		dfs(start_x,start_y);
		printf("%d\n",count);
	}
	return 0;
}
void dfs(int x,int y)
{
	int i;
	if(a[x][y]=='#') return;
	if(a[x][y]=='.') {count++;}
	a[x][y]='#';
	for(i=0;i<4;i++)
	{
		dfs(x+dir[i][0],y+dir[i][1]);
	}

}


你可能感兴趣的:(c)