【DFS练习】【最大的蛋糕块】-C++

在这里插入图片描述
这道题目是一个基本的dfs模板(?)下面日常贴一波dfs的基本模板:

void dfs()//参数用来表示状态  
{  
    if(到达终点状态)  
    {  
        ...//根据题意添加  
        return;  
    }  
    if(越界或者是不合法状态)  
        return;  
    if(特殊状态)//剪枝
        return ;
    for(扩展方式)  
    {  
        if(扩展方式所达到状态合法)  
        {  
            修改操作;//根据题意来添加  
            标记;  
            dfs();  
            (还原标记);  
            //是否还原标记根据题意  
            //如果加上(还原标记)就是 回溯法  
        }  
    }  
}  

这道题的思路是:先输入,然后遍历一遍原图,如果遇到#(蛋糕)就向四周扩散,同一块蛋糕全部变成’.’,然后cnt++,最后输出就可以了。直接改原图,不需要转换成01矩阵会简单一些。
代码:

#include<bits/stdc++.h>
using namespace std;
int cnt=0;
char a[1010][1010];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool visited[1010][1010];
void dfs(int x,int y)
{
	visited[x][y]=1;
	a[x][y]='.';
	cnt++;
	for(int i=0;i<4;i++)
	{
		int tx=x+dir[i][0];
		int ty=y+dir[i][1];
		if(a[tx][ty]=='#')
		{
			dfs(tx,ty);
		}
	}
}
int main()
{
	int n,m,ans=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(a[i][j]=='#')
			{
				cnt=0;
				dfs(i,j);
				ans=max(ans,cnt);
			}
		}
	}
	cout<<ans<<endl;
}
posted @ 2019-07-08 19:24  摸鱼酱  阅读(258)  评论(0编辑  收藏  举报