计蒜客T1211 红与黑问题

一道简单的深度搜索题
思路很简单

蒜厂有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。

请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入格式
第一行是两个整数 WW 和 HH,分别表示 xx 方向和 yy 方向瓷砖的数量。WW 和 HH 都不超过 2020。

在接下来的 HH 行中,每行包括 WW 个字符。每个字符表示一块瓷砖的颜色,规则如下

1)’.’:黑色的瓷砖;
2)’#’:白色的瓷砖;
3)’@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

输出格式
输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

输出时每行末尾的多余空格,不影响答案正确性

样例输入
6 9
…#.
…#





#@…#
.#…#.
样例输出
45

首先,先处理一下地图,将字符转为数组形式便于处理
然后,标明剪枝条件,即数组越界或者此点已被搜索。
最后找出起始点搜索一下就行了。 ``

#include 
#include
#include
#include

using namespace std;
int a[100][100];
int vis[100][100];
void dfs(int n,int m)
{
	 //越界或走过判断 
	if(n<0||n>=30||m<0||m>=30)
	return ;
    
    if(vis[n][m]==1) return ;
    //走过标记 
    vis[n][m]=1;
    //对上下左右进行搜索,如果有点符合条件,计改点10作为标志 
	if(a[n+1][m]==1)
	{
	    
		a[n+1][m]=10;
		dfs(n+1,m);
		
	}
	if(a[n][m+1]==1)
	{   
	    
		a[n][m+1]=10;
		dfs(n,m+1);
		
	}
	if(a[n-1][m]==1&&n>0)
	{ 
	    
		a[n-1][m]=10;
		dfs(n-1,m);
		
	}
	if(a[n][m-1]==1&&m>0)
	{
		
		a[n][m-1]=10;
		dfs(n,m-1);
		
	}
	
}
int main()
{
  	int w,h;//地图大小 
  	cin>>w;
  	cin>>h;
  	
    //处理地图,1代表可走,0代表不可走,2代表出发点 
    char s[1000];
    int x=-1,y=-1;
    for(int i=0;i<h;i++)
    {
	 scanf("%s",s);
    for(int j=0;j<w;j++)
    {
    	if(s[j]=='.')
    	a[i][j]=1;
    	if(s[j]=='#')
    	a[i][j]=0;
    	if(s[j]=='@')
    	{
    		//记录起始点作为搜索对象 
    	   a[i][j]=2;
    	   x=j;
    	   y=i;
    	   
		}
    	}
	}
	//进行搜索 
	dfs(y,x);
	
	//计数 点为10即符合条件 
	int cnt=0;
	for(int i=0;i<h;i++)
	{
	    for(int j=0;j<w;j++)
	    {
	    	if(a[i][j]==10)
	    	cnt++;
	    	
		}
	}
	cnt++;
	cout << cnt << endl; 
}

你可能感兴趣的:(ACM)