- 《挑战》中开列的DFS习题之一;
- 思维难度不大,读懂并直接模拟游戏规则即可;
- 实际写起来坑不少,考验码程序的基本功;
- 屡次WA,最后好不容易肉眼揪完错兴奋地交上去发现PE,再后来发现输出时没打‘\n’。。。
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int dy[5]={-1,1,0,0};
const int dx[5]={0,0,-1,1};
int N,M,brd[30][30],curstp,minstp;
vector<int> anv;
void dfs(int y,int x)
{
if(curstp>=10) return;
int ny,nx;
for(int i=0;i<4;i++)
{
if(y+dy[i]<1||y+dy[i]>N||x+dx[i]<1||x+dx[i]>M) continue;
if(brd[y+dy[i]][x+dx[i]]==1) continue;
ny=y;
nx=x;
for(;;)
{
ny+=dy[i];
nx+=dx[i];
if(ny<1||ny>N||nx<1||nx>M) break;
if(brd[ny][nx]==3)
{
minstp=min(minstp,curstp+1);
return;
}
if(ny+dy[i]<1||ny+dy[i]>N||nx+dx[i]<1||nx+dx[i]>M) break;
if(brd[ny+dy[i]][nx+dx[i]]==1)
{
brd[ny+dy[i]][nx+dx[i]]=0;
curstp++;
dfs(ny,nx);
curstp--;
brd[ny+dy[i]][nx+dx[i]]=1;
break;
}
}
}
return;
}
int main()
{
int sy,sx;
for(;;)
{
scanf("%d%d",&M,&N);
if(!M) break;
curstp=0;
minstp=0x3f3f3f3f;
for(int i=1;i<=N;i++) for(int j=1;j<=M;j++)
{
scanf("%d",brd[i]+j);
if(brd[i][j]==2)
{
sy=i;
sx=j;
}
}
dfs(sy,sx);
minstp>10?anv.push_back(-1):anv.push_back(minstp);
}
for(int i=0;i<anv.size();i++) printf("%d\n",anv.at(i));
return 0;
}