1. 程式人生 > >【ACM】CODE[VS] 2806(DFS)

【ACM】CODE[VS] 2806(DFS)

感覺有點入了DFS的門檻,距離完全掌握還差得遠呢

AC程式碼:執行時間為7ms

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 26;
int vis[maxn][maxn],col,line,flag,count;
char map[maxn][maxn];
int xx[5]={0,-1,1,0,0};
int yy[5]={0,0,0,-1,1};
void dfs(int x,int y)
{
	int i;
	vis[x][y]=1;
	for(i=1;i<=4;i++)
	{
		if(x+xx[i]>=0 && y+yy[i]>=0 && x+xx[i]<line && y+yy[i]<col && map[x+xx[i]][y+yy[i]]!='#' && !vis[x+xx[i]][y+yy[i]])
		{
			count++;
			dfs(x+xx[i],y+yy[i]);
		}
	}
	return;
}
int main ()
{
	int T,i,j,m,n;
	while(scanf("%d%d",&col,&line)==2 && col && line)
	{
		getchar();
		count=1;
		//先輸入列,在輸入行 
		memset(vis,0,sizeof(vis));
		memset(map,0,sizeof(map));
		for(i=0;i<line;i++)
		{
			for(j=0;j<col;j++)
			{
				cin>>map[i][j];
				if(map[i][j]=='@')
				{
					m=i;n=j;
				}
			}
		}	
		dfs(m,n);	
		printf("%d\n",count);	
	}
	return 0;
}

修改後:執行時間4ms

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 26;
int vis[maxn][maxn],col,line,flag,count;
char map[maxn][maxn];
int xx[5]={0,-1,1,0,0};
int yy[5]={0,0,0,-1,1};
void dfs(int x,int y)
{
	//先判斷,在標記
	if(x<0 || x>=line || y<0 || y>=col || map[x][y]=='#' || vis[x][y]==1)	return ; 
	int i;
	if(map[x][y]=='.')
	{
		vis[x][y]=1;
		count++;
	}
	for(i=1;i<=4;i++)
	{
		dfs(x+xx[i],y+yy[i]);	
	}
	return;
}
int main ()
{
	int T,i,j,m,n;
	while(scanf("%d%d",&col,&line)==2 && col && line)
	{
		getchar();
		count=1;
		//先輸入列,在輸入行 
		memset(vis,0,sizeof(vis));
		memset(map,0,sizeof(map));
		for(i=0;i<line;i++)
		{
			for(j=0;j<col;j++)
			{
				cin>>map[i][j];
				if(map[i][j]=='@')
				{
					m=i;n=j;
				}
			}
		}	
		dfs(m,n);	
		printf("%d\n",count);	
	}
	return 0;
}