您的位置:首页 > 其它

poj 3009 Curling 2.0

2012-07-16 10:41 183 查看
题意:搜索,已知起点和终点,求石子从起点到达终点的最短路,如果无法到达,则输出-1。石子移动的具体规则如下:

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

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

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

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

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

b、如果出界,游戏失败

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

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

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;

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