题意:搜索,已知起点和终点,求石子从起点到达终点的最短路,如果无法到达,则输出-1。石子移动的具体规则如下:
6,用dfs
代码:
#include<iostream>
using namespace std;
int map[30][30];
int r,c,ans;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int px,int py,int count)
{
int nr,nc;
if(count>10||count>ans) return;
for(int i=0;i<4;i++)
{
nr=px;nc=py;
if(map[nr+dir[i][0]][nc+dir[i][1]]!=1)
{
while(map[nr+dir[i][0]][nc+dir[i][1]]!=1)
{
nr=nr+dir[i][0];
nc=nc+dir[i][1];
if(!(nr>=1&&nr<=r&&nc>=1&&nc<=c))
{
break;
}
if(map[nr][nc]==3)
{
if(count+1<ans)
{
ans=count+1;
}
return ;
}
}
if(nr>=1&&nr<=r&&nc>=1&&nc<=c)
{
map[nr+dir[i][0]][nc+dir[i][1]]=0;
dfs(nr,nc,count+1);
map[nr+dir[i][0]][nc+dir[i][1]]=1;
}
}
}
}
int main()
{
int sr,sc,i,j;
while(cin>>c>>r,r,c)
{
memset(map,0,sizeof(map));
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
{
cin>>map[i][j];
if(map[i][j]==2)
{sc=j;sr=i;}
}
ans=9999;
dfs(sr,sc,0);
if(ans>10) cout<<-1<<endl;
else cout<<ans<<endl;
}
return 0;
}