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;
}
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;
}
相关文章推荐
- poj 3009 Curling 2.0(dfs)
- POJ - 3009 Curling 2.0(DFS,模拟)
- poj 3009 Curling 2.0 (dfs)
- POJ_3009 Curling 2.0(dfs)
- POJ 3009-Curling 2.0
- POJ 3009 Curling 2.0(DFS)
- poj 3009 Curling 2.0 dfs
- poj 3009 Curling 2.0
- poj-3009 Curling 2.0-DFS
- POJ 3009 Curling 2.0
- POJ 3009 Curling 2.0
- poj 3009 Curling 2.0(冰壶 直到遇到障碍才停下 dfs)
- POJ 3009 Curling 2.0(dfs)
- Poj 3009 Curling 2.0 (Dfs)
- POJ 3009:Curling 2.0 推箱子
- POJ 3009 Curling 2.0 简单递归
- POJ3009 Curling2.0 (DFS求最短路(已知最长的情况下))
- poj3009_Curling 2.0
- POJ 3009 Curling 2.0
- POJ 3009 Curling 2.0