题目:
http://poj.org/problem?id=3009
题意:从2 出发到达 3,碰到1 会把冰块击碎,并退回到前一个位置,求转换方位的最小步数。
思路:DFS 遍历所有的情况,寻找最小的步数。
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[25][25];
int x,y,step;
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
void dfs(int s,int n,int m)
{
//step++;
if(s>10)
{
return;
}
int move_ok,nx,ny;
for(int i=0;i<4;i++)
{
move_ok=0;
nx=n+dx[i],ny=m+dy[i];
if(nx<0||nx>=x||ny<0||ny>=y) continue;
if(map[nx][ny]==3)
{
if(step>s) step=s;
continue;
}
if(map[nx][ny]==1)
{
//move_ok=1;
continue;
}
while(!move_ok)
{
nx=nx+dx[i];ny=ny+dy[i];
if(nx<0||nx>=x||ny<0||ny>=y) break;
if(map[nx][ny]==3)
{
if(step>s) step=s;
break;
}
if(map[nx][ny]==1)
{
move_ok=1;
}
}
if(move_ok)
{
//puts("1");
map[nx][ny]=0;
dfs(s+1,nx-dx[i],ny-dy[i]);
map[nx][ny]=1;
}
}
}
int main()
{
//freopen("in.in","r",stdin);
while(~scanf("%d%d",&y,&x),x,y)
{
memset(map,0,sizeof(map));
int fi,fj;
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
{
fi=i,fj=j;
map[i][j]=0;
}
}
}
step=0xfffffff;
dfs(1,fi,fj);
if(step>10) printf("-1\n");
else printf("%d\n",step);
}
return 0;
}