Curling 2.0(POJ--3009
2015-08-17 20:01
369 查看
Description
On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is played on an ice game board on which a square mesh is marked. They use
only a single stone. The purpose of the game is to lead the stone from the start to the goal with the minimum number of moves.
Fig. 1 shows an example of a game board. Some squares may be occupied with blocks. There are two special squares namely the start and the goal, which are not occupied with blocks. (These two squares are distinct.)
Once the stone begins to move, it will proceed until it hits a block. In order to bring the stone to the goal, you may have to stop the stone by hitting it against a block, and throw again.
Fig. 1: Example of board (S: start, G: goal)
The movement of the stone obeys the following rules:
At the beginning, the stone stands still at the start square.
The movements of the stone are restricted to x and y directions. Diagonal moves are prohibited.
When the stone stands still, you can make it moving by throwing it. You may throw it to any direction unless it is blocked immediately(Fig. 2(a)).
Once thrown, the stone keeps moving to the same direction until one of the following occurs:
The stone hits a block (Fig. 2(b), (c)).
The stone stops at the square next to the block it hit.
The block disappears.
The stone gets out of the board.
The game ends in failure.
The stone reaches the goal square.
The stone stops there and the game ends in success.
You cannot throw the stone more than 10 times in a game. If the stone does not reach the goal in 10 moves, the game ends in failure.
Fig. 2: Stone movements
Under the rules, we would like to know whether the stone at the start can reach the goal and, if yes, the minimum number of moves required.
With the initial configuration shown in Fig. 1, 4 moves are required to bring the stone from the start to the goal. The route is shown in Fig. 3(a). Notice when the stone reaches the goal, the board configuration
has changed as in Fig. 3(b).
Fig. 3: The solution for Fig. D-1 and the final board configuration
Input
The input is a sequence of datasets. The end of the input is indicated by a line containing two zeros separated by a space. The number of datasets never exceeds 100.
Each dataset is formatted as follows.
the width(=w) and the height(=h) of the board
First row of the board
...
h-th row of the board
The width and the height of the board satisfy: 2 <= w <= 20, 1 <= h <= 20.
Each line consists of w decimal numbers delimited by a space. The number describes the status of the corresponding square.
The dataset for Fig. D-1 is as follows:
6 6
1 0 0 2 1 0
1 1 0 0 0 0
0 0 0 0 0 3
0 0 0 0 0 0
1 0 0 0 0 1
0 1 1 1 1 1
Output
For each dataset, print a line having a decimal integer indicating the minimum number of moves along a route from the start to the goal. If there are no such routes, print -1 instead. Each line should not have
any character other than this number.
题意:这是一个冰球游戏,在一块冰地上滚球,在冰地上的每个方格里都有一个相应的数字,分别表示着一定的意义,如果该方块上的数字是0,说明冰球可以从这块冰地上滚;如果该方块上的数字是1,则表示该方块上有一块石头,如果冰球碰到该石头那么冰球就会停止,该石头就会消失;如果该方块上的数字是2,表示这是冰球的初始位置;如果该方块上的数字是3,表示这是冰球的终点位置。冰球要是能朝着一个方向运动则会一直运动下去除非碰到石头才会停止或出界。只有当冰球周围有空地时冰球才能移动。(PS:冰球的初始位置和终点位置都是空点无石头。)多组输入。每组输入m和n,分别代表冰地的列数和行数,接下来输入冰地地图。问冰球是否能在十步内从起点到达终点。
如果能则输出最少步数,如果不能则输出-1。
Sample Input
Sample Output
On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is played on an ice game board on which a square mesh is marked. They use
only a single stone. The purpose of the game is to lead the stone from the start to the goal with the minimum number of moves.
Fig. 1 shows an example of a game board. Some squares may be occupied with blocks. There are two special squares namely the start and the goal, which are not occupied with blocks. (These two squares are distinct.)
Once the stone begins to move, it will proceed until it hits a block. In order to bring the stone to the goal, you may have to stop the stone by hitting it against a block, and throw again.
Fig. 1: Example of board (S: start, G: goal)
The movement of the stone obeys the following rules:
At the beginning, the stone stands still at the start square.
The movements of the stone are restricted to x and y directions. Diagonal moves are prohibited.
When the stone stands still, you can make it moving by throwing it. You may throw it to any direction unless it is blocked immediately(Fig. 2(a)).
Once thrown, the stone keeps moving to the same direction until one of the following occurs:
The stone hits a block (Fig. 2(b), (c)).
The stone stops at the square next to the block it hit.
The block disappears.
The stone gets out of the board.
The game ends in failure.
The stone reaches the goal square.
The stone stops there and the game ends in success.
You cannot throw the stone more than 10 times in a game. If the stone does not reach the goal in 10 moves, the game ends in failure.
Fig. 2: Stone movements
Under the rules, we would like to know whether the stone at the start can reach the goal and, if yes, the minimum number of moves required.
With the initial configuration shown in Fig. 1, 4 moves are required to bring the stone from the start to the goal. The route is shown in Fig. 3(a). Notice when the stone reaches the goal, the board configuration
has changed as in Fig. 3(b).
Fig. 3: The solution for Fig. D-1 and the final board configuration
Input
The input is a sequence of datasets. The end of the input is indicated by a line containing two zeros separated by a space. The number of datasets never exceeds 100.
Each dataset is formatted as follows.
the width(=w) and the height(=h) of the board
First row of the board
...
h-th row of the board
The width and the height of the board satisfy: 2 <= w <= 20, 1 <= h <= 20.
Each line consists of w decimal numbers delimited by a space. The number describes the status of the corresponding square.
0 | vacant square |
1 | block |
2 | start position |
3 | goal position |
6 6
1 0 0 2 1 0
1 1 0 0 0 0
0 0 0 0 0 3
0 0 0 0 0 0
1 0 0 0 0 1
0 1 1 1 1 1
Output
For each dataset, print a line having a decimal integer indicating the minimum number of moves along a route from the start to the goal. If there are no such routes, print -1 instead. Each line should not have
any character other than this number.
题意:这是一个冰球游戏,在一块冰地上滚球,在冰地上的每个方格里都有一个相应的数字,分别表示着一定的意义,如果该方块上的数字是0,说明冰球可以从这块冰地上滚;如果该方块上的数字是1,则表示该方块上有一块石头,如果冰球碰到该石头那么冰球就会停止,该石头就会消失;如果该方块上的数字是2,表示这是冰球的初始位置;如果该方块上的数字是3,表示这是冰球的终点位置。冰球要是能朝着一个方向运动则会一直运动下去除非碰到石头才会停止或出界。只有当冰球周围有空地时冰球才能移动。(PS:冰球的初始位置和终点位置都是空点无石头。)多组输入。每组输入m和n,分别代表冰地的列数和行数,接下来输入冰地地图。问冰球是否能在十步内从起点到达终点。
如果能则输出最少步数,如果不能则输出-1。
Sample Input
2 1 3 2 6 6 1 0 0 2 1 0 1 1 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 1 1 6 1 1 1 2 1 1 3 6 1 1 0 2 1 1 3 12 1 2 0 1 1 1 1 1 1 1 1 1 3 13 1 2 0 1 1 1 1 1 1 1 1 1 1 3 0 0
Sample Output
1 4 -1 4 10 -1
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #define MAX 0x3f3f3f3f using namespace std; int mmap[30][30]; //存放地图 int w,h,ans; int dx[]= {1,0,-1,0}; //四个方向坐标 int dy[]= {0,1,0,-1}; void DFS(int sx,int sy,int ex,int ey,int sum) { if(sum>10) //如果步数已经超过10步则没必要再走下去 return ; if(sx==ex&&sy==ey) { ans=min(ans,sum); //取步数最少 return ; } for(int i=0; i<4; i++) { int xx=sx+dx[i]; int yy=sy+dy[i]; if(xx<0||xx>=h||yy<0||yy>=w) continue; if(mmap[xx][yy]==3) //如果是终点则直接递归下去 DFS(xx,yy,ex,ey,sum+1); if(mmap[xx][yy]==1) //如果是石头则不能走向该点 continue; while(1) { xx+=dx[i]; yy+=dy[i]; if(xx>=0&&xx<h&&yy>=0&&yy<w) { if(mmap[xx][yy]==1) { mmap[xx][yy]=0; //石头消失,取消石头标记 DFS(xx-dx[i],yy-dy[i],ex,ey,sum+1); mmap[xx][yy]=1; //回溯回来,恢复石头标记 break; } else if(mmap[xx][yy]==3) { DFS(xx,yy,ex,ey,sum+1); } } else break; } } } int main() { //freopen("lalala.text","r",stdin); int xs,xe,ys,ye; while(~scanf("%d %d",&w,&h)) { if(w==0&&h==0) break; memset(mmap,-1,sizeof(mmap)); for(int i=0; i<h; i++) for(int j=0; j<w; j++) { scanf("%d",&mmap[i][j]); if(mmap[i][j]==2) { xs=i; ys=j; } if(mmap[i][j]==3) { xe=i; ye=j; } } //printf("%d %d\n%d %d\n",xs,ys,xe,ye); ans=MAX; DFS(xs,ys,xe,ye,0); if(ans<MAX) printf("%d\n",ans); else printf("-1\n"); } return 0; }
相关文章推荐
- Check the difficulty of problems
- 算法竞赛入门经典:第六章 数据结构基础 6.13拓扑排序
- Jetty vs. Tomcat
- 数字滤波器设计
- Android四大组件之Activity
- BZOJ 1603 [Usaco2008 Oct]打谷机 dfs
- Check the difficulty of problems
- hdoj 1596 find the safest road【最短路变形,求最大安全系数】
- hdu-2544 最短路
- ExecutorService与Executors例子的简单剖析
- CentOS下使用yum安装配置和使用svn
- 算法竞赛入门经典:第六章 数据结构基础 6.12迷宫路径
- Qt on android 播放视频的实现
- --Untltled(hdu5339) (集合子集的枚举,二进制枚举)
- 软件测试之独步武林系列(一)
- 杭电1517
- 黑马程序员--Java基础学习(数组)第四天
- 使用标准输入对话框
- 使用技巧,那些可能会忘记的PS小技巧
- jquery表格简单插件