《挑战》中开列的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 ;
}