题目大意:给出一个w*h的地图,0代表空地,1代表障碍物,2代表起点,3代表终点。从起点出发每次可以移动多个方格,且只能朝不是障碍物的方向移动,直到遇到障碍物才停下来,此时障碍物也将消失。如果行动次数超过10就表示失败。否则记录达到终点时的行动次数,要求输出最小的行动次数。
思路:分别朝四个可能的方向深搜。
#include <iostream>
using namespace std;
#include <stdio.h>
int w,h,beginx,beginy,endx,endy,result;
int map[22][22];
int minstep;
void DFS( int x, int y, int ctr, int direction ) {
if (ctr>minstep)
return;
if (direction==1) {
if (x+1>h||map[x+1][y]==1)
return;
while ((x+1<=h&&map[x+1][y]==0)||(x+1<=h&&map[x+1][y]==3)) {
if (map[x+1][y]==3) {
if (ctr<minstep)
minstep=ctr;
return;
}
x++;
if (x+1>h)
return;
if (map[x+1][y]==1) {
map[x+1][y]=0;
break;
}
}
DFS(x,y,ctr+1,1);
DFS(x,y,ctr+1,2);
DFS(x,y,ctr+1,3);
DFS(x,y,ctr+1,4);
map[x+1][y]=1;
}
else if (direction==2) {
if (x-1<1||map[x-1][y]==1)
return;
while ((x-1>=1&&map[x-1][y]==0)||(x-1>=1&&map[x-1][y]==3)) {
if (map[x-1][y]==3) {
if (ctr<minstep)
minstep=ctr;
return;
}
x--;
if (x-1<1)
return;
if (map[x-1][y]==1) {
map[x-1][y]=0;
break;
}
}
DFS(x,y,ctr+1,1);
DFS(x,y,ctr+1,2);
DFS(x,y,ctr+1,3);
DFS(x,y,ctr+1,4);
map[x-1][y]=1;
}
else if (direction==3) {
if (y+1>w||map[x][y+1]==1)
return;
while ((y+1<=w&&map[x][y+1]==0)||(y+1<=w&&map[x][y+1]==3)) {
if (map[x][y+1]==3) {
if (ctr<minstep)
minstep=ctr;
return;
}
y++;
if (y+1>w)
return;
if (map[x][y+1]==1) {
map[x][y+1]=0;
break;
}
}
DFS(x,y,ctr+1,1);
DFS(x,y,ctr+1,2);
DFS(x,y,ctr+1,3);
DFS(x,y,ctr+1,4);
map[x][y+1]=1;
}
else {
if (y-1<1||map[x][y-1]==1)
return;
while ((y-1>=1&&map[x][y-1]==0)||(y-1>=1&&map[x][y-1]==3)) {
if (map[x][y-1]==3) {
if (ctr<minstep)
minstep=ctr;
return;
}
y--;
if (y-1<1)
return;
if (map[x][y-1]==1) {
map[x][y-1]=0;
break;
}
}
DFS(x,y,ctr+1,1);
DFS(x,y,ctr+1,2);
DFS(x,y,ctr+1,3);
DFS(x,y,ctr+1,4);
map[x][y-1]=1;
}
}
int main()
{
int i,j,k;
scanf("%d%d",&w,&h);
while (!(w==0&&h==0)) {
result=1;
minstep=11;
for (i=1;i<=h;i++) {
for (j=1;j<=w;j++) {
scanf("%d",&map[i][j]);
if (map[i][j]==2) {
beginx=i;
beginy=j;
map[i][j]=0;
}
if (map[i][j]==3) {
endx=i;
endy=j;
}
}
}
DFS(beginx,beginy,1,1);
DFS(beginx,beginy,1,2);
DFS(beginx,beginy,1,3);
DFS(beginx,beginy,1,4);
if (minstep<=10)
printf("%d\n",minstep);
else
printf("-1\n");
scanf("%d%d",&w,&h);
}
return 0;
}