前言:
真的离谱了,一不小心就..........唉,不说了
OK接下来给大家讲一下这道题。
描述
网址:4254 - 基础算法-搜索与回溯:迷宫问题(migong)
设有一个 N*N(2<=N<10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放 0 和 1,0 表示可通,1 表示不能,入口和出口处肯定是 0。迷宫走的规则如下所示:即从某点开始,有八个方向可走,前进方格中数字为 0 时表示可通过,为 1 时表示不可通过,要另找路径。找出所有从入口(左上角)到出口(右上角)的路径(不能重复),输出路径总数,如果无法到达,则输出 0。
输入
输出
样例
输入
3
0 0 0
0 1 1
1 0 0
输出
2 //路径总数
题目读完了,不得不说,真的很简单,用求8连通块的思路,我们就能轻松KO。
代码:
#include<bits/stdc++.h>
using namespace std;
int n, arr[100][100], m = 0;
int x[9] = {1, -1, 0, 0, -1, 1, -1, 1};
int y[9] = {0, 0, 1, -1, 1, 1, -1, -1};
void dfs(int i, int j) {
if (i == 1 && j == n ) {
m++;
return;
}
for (int k = 0; k < 8; ++k) {
int xx = i + x[k];
int yy = j + y[k];
if (xx <= n && yy <= n && xx > 0 && yy > 0 && arr[xx][yy] == 0) {
arr[xx][yy] = 1;
dfs(xx, yy);
arr[xx][yy] = 0;
}
}
return ;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
cin >> arr[i][j];
}
}
arr[1][1] = 1;
dfs(1, 1);
cout << m << endl;
return 0;
}
提交一下,通过了。
所以说,会做的,不要作,我就是数组开大了,才落得错了n次的下场。