黑白迷宫问题——深度优先搜索算法

版权声明:就是码字也不容易啊 https://blog.csdn.net/qq_40946921/article/details/83689322

2021年,九月,小w发现自己位于一个巨大的由黑格和白格组成的n行m列的迷宫中。

小w只能从白格走到黑格或从黑格走到白格,

小w找到了ljf,她想知道自己从每一个格子出发不回头可以走多少个格子。

但是ljf忙于在ioi中虐场,把问题留给了你。

注意:原题是可以回头,属于连通图问题,这个题目是我把题意给理解错了,只好将错就错...

输入格式:

第一行:两个整数 n、m
接下来n行m列描述这个迷宫
若第i行,第j个为1,则表示迷宫的第ii行第jj个格子为黑,反之则为白。

输出格式

     

n行m列
第i行第j个数表示从第ii行第jj个格子能走到的格子总数

输入样例1

2 2
1 0

输出样例2

2 2

 输入样例2

2 4
1 0 0 0 
0 1 0 1

输出样例2

6 5 1 7
7 4 5 6

数据范围:

对于30%的数据 n,m≤50n,m≤50

另外10%的数据 所有格子都为黑格

对于100%的数据 n,m≤2000 

#include<iostream>
using namespace std;
#define M 2000
int graph[M][M] = {1,0};
int result[M][M];
int visited[M][M];
int nx, ny,n=1,m=2;
int dx[4] = { 1,-1,0,0 },
	dy[4] = { 0,0,1,-1 };
int max=0;
int search(int x,int y,int k) {			//深度优先搜索算法
	visited[x][y] = 1;
	max = k > max ? k : max;
	for (int i = 0; i < 4; i++) {		//四个方向进行搜索
		nx = x + dx[i];
		ny = y + dy[i];
		if (nx >= 0 && nx < n&&ny >= 0 && ny < m && !visited[nx][ny] && graph[x][y] != graph[nx][ny]) {		//探测判断
			visited[nx][ny] = 1;
			search(nx, ny, k+1);        //进行下一次探测
		}
	}
	return max;
}
int main(){
	cin >> n >> m;
	for (int i=0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> graph[i][j];
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			memset(visited, 0, sizeof(visited));		//数据初始化
			max = 0;
			result[i][j] = search(i, j, 1);
		}
	}
	cout << "结果:" << endl;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << result[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40946921/article/details/83689322