洛谷P1162 填涂颜色 【DFS】

题目链接:P1162 填涂颜色
洛谷P1162 填涂颜色 【DFS】_第1张图片

程序说明:

从某一点开始搜索并标记,碰到墙或者已经被搜索过就返回。除了墙以外没有被标记过的点就是被墙围住的点,最后输出2即可。

此题最坑的地方在于有可能开始搜索的第一个点就是墙,因此存图的数组下标从1开始而非0,目的是在图的外面加一圈0,这样就能解决图的第一个点就是墙的问题。

注意递归结束的条件!

代码如下:

#include 
#define MAX 35
using namespace std;
int a[MAX][MAX];
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
int n;
void dfs(int x, int y) {
	//碰到墙或者被搜过了或者出了范围就返回 
	if(x < 0 || x > n + 1 || y < 0 || y > n + 1 || a[x][y] != 0)
		return; 
	a[x][y] = 2; //将搜索过的地方标记为2 
	//向4个方向探索 
	for(int i = 0; i < 4; i++) 
		dfs(x + dx[i], y + dy[i]); 
}
	
int main() {
	cin>>n;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= n; j++)
			cin>>a[i][j];
	dfs(0, 0);
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= n; j++) {
			if(a[i][j] == 2)
				cout<<0<<" "; //被搜索过的地方为0 
			else if(a[i][j] == 0)
				cout<<2<<" "; //除了墙以外没被搜索过的地方为2 
			else 
				cout<<a[i][j]<<" ";
		}			
		cout<<endl;
	}
	return 0;
} 

你可能感兴趣的:(算法题解,#,DFS)