1. 程式人生 > >黑白迷宮問題——深度優先搜尋演算法

黑白迷宮問題——深度優先搜尋演算法

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;
}