问题 G: 方格迷宫
时间限制: 1 Sec 内存限制: 128 MB
提交: 81 解决: 63
[提交][状态][讨论版][命题人: cbc]
题目描述
设有一个N*N(2<=N<10)方格的迷宫,入口和出口分别在左上角和右上角。迷宫格子中分别放0和1,0表示可通,1表示不能,入口和出口处肯定是0。迷宫走的规则如下所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径。找出所有从入口(左上角)到出口(右上角)的路径(不能重复),输出路径总数,如果无法到达,则输出0。
输入
第一行是1个正整数n(2<=n<10),表示迷宫规模是n*n的。接下来n行是一个n*n的0-1矩阵。
输出
找出所有从入口(左上角)到出口(右上角)的路径(不能重复),输出路径总数,如果无法到达,则输出0。
样例输入
3 0 0 0 0 1 1 1 0 0
样例输出
2
注意:把8个方向都试一遍,走完一步要记得标注已经走过。
#include <iostream>
using
namespace
std;
int
a[11][11],n;
int
sum=0;
int
x[8]={-1,0,1,-1,1,-1,0,1};
int
y[8]={1,1,1,0,0,-1,-1,-1};
void
f(
int
i,
int
j);
int
main(){
cin>>n;
for
(
int
i=1;i<=n;i++)
for
(
int
j=1;j<=n;j++){
cin>>a[i][j];
}
for
(
int
i=0;i<=n+1;i++){
a[i][0]=1;
a[i][n+1]=1;
}
for
(
int
j=0;j<=n+1;j++) {
a[n+1][j]=1;
a[0][j]=1;
}
f(1,1);
cout<<sum<<endl;
}
void
f(
int
i,
int
j){
if
(i==1&&j==n){
sum++;
return
;
}
for
(
int
k=0;k<8;k++)
if
(a[i+x[k]][j+y[k]]==0){
a[i][j]=1;
f(i+x[k],j+y[k]);
a[i][j]=0;
}
}