Problem : 走迷宫
Description
小明与许多同学一起参加了今年的“信息与未来”小学生夏令营活动。夏令营的组织者设计安排了许多有趣的活动
,走迷宫就是其中的一项。迷宫由N*N个方格组成,每个方格均被组织者事先标上了“0”或“1”(左上角第一个
方格和右下角最后一个方格一定是“0”)。当你进入左上角的第一个方格中时,看到相邻的方格是“0”时则可以
进入,而如果是“1”时则表示此路不通。小明被告之:从迷宫的左上角第一个方格的入口处准备进入时,你可得
到一个记有N*N分值的记分标,每经过一个标有“0”的方格,记分表将自动扣去1分,当走到右下角最后一个方格
的出口处时,将显示你手中的记分表剩余的分值。夏令营的组织者将只奖励所有参加此项活动中,记分表剩余的分
值最多的营员。
Input
第一行是一个整数N(3<=N<=40),接下来有N行,每行均有N个由0和1组成的数据。
Output
一个整数(记分表剩余的分值)
Sample Input
4
0011
1000
0001
1000
Sample Output
9
#include<bits/stdc++.h>
using namespace std;
int n,c=1,e[10000],f[10000],d,a[41][41],xx[4]={-1,1,0,0},yy[4]={0,0,1,-1};
void dfs(int aa,int bb)
{
d++;
if(aa+bb==2*n)
{
cout<<n*n-a[aa][bb];
exit(0);
}
for(int i=0;i<4;i++)
if(aa+xx[i]>0&&aa+xx[i]<=n&&bb+yy[i]>0&&bb+yy[i]<=n
&&!a[aa+xx[i]][bb+yy[i]])
{
c++;
a[aa+xx[i]][bb+yy[i]]=a[aa][bb]+1;
e[c]=aa+xx[i];f[c]=bb+yy[i];
}
dfs(e[d+1],f[d+1]);
}
main()
{
cin>>n;char aaa;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>aaa;a[i][j]=aaa-'0';
}
a[1][1]=1;
dfs(1,1);
}