黑白迷宮問題——深度優先搜尋演算法
阿新 • • 發佈:2018-11-23
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; }