您的位置:首页 > 其它

poj解题报告——3009

2014-12-13 21:10 232 查看
题意,已知起点和终点,求石子从起点到达终点的最短路,如果无法到达,则输出-1。石子移动的具体规则如下

1、开始时,石子在起点s处

2、运动方向可以是水平或垂直的,不能斜方向运动

3、最开始的时候,你可以将石子向上下左右任意一个方向抛,如果与它相邻的点是障碍物的话除外

4、一旦石子开始运动,有三种可能:

a、遇到障碍物,石子会停在障碍物的前一格,障碍物会消失

b、如果出界,游戏失败

c、到达终点,游戏结束并成功

5、如果移动的次数超过10次,将认为游戏是失败的

这题让我想起了我学数据结构的时候,书上的一道例题,也是走迷宫,用的是递归。

代码如下

#include<stdio.h>

#define MAX 99999999

int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

int ei,ej;

int map[25][25];

int w,h,steps,min;

void dfs(int si,int sj)

{

int i,pi,pj;

if(steps>=10)

return ;

for(i=0;i<4;i++)

{

pi=si,pj=sj;

while(1)

{

pi+=dir[i][0];

pj+=dir[i][1];

if(pi<=0||pi>h||pj<=0||pj>w)

break;

if(pi==ei&&pj==ej)

{

steps++;

if(min>steps)

min=steps;

steps--;

return;

}

else if(map[pi][pj]==1)

{

if(pi-dir[i][0]!=si||pj-dir[i][1]!=sj)

{

map[pi][pj]=0;

steps++;

dfs(pi-dir[i][0],pj-dir[i][1]);

map[pi][pj]=1;

steps--;

}

break;

}

}

}

}

int main()

{

int si,sj,i,j;

while(scanf("%d%d",&w,&h)==2&&(w||h))

{

for(i=1;i<=h;i++)

for(j=1;j<=w;j++)

{

scanf("%d",&map[i][j]);

if(map[i][j]==2)

si=i,sj=j;

else if(map[i][j]==3)

ei=i,ej=j;

}

min=MAX;

steps=0;

dfs(si,sj);

if(min==MAX)

printf("-1\n");

else

printf("%d\n",min);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: