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