HDOJ-三部曲一(搜索、数学)-1003-Curling 2.0
Curling 2.0
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 22 Accepted Submission(s) : 10
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.
- The stone hits a block (Fig. 2(b), (c)).
- 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
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
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
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.
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
#include<iostream>
#include<cstring>
using namespace std; struct pos
{
int x,y;
}; int w,h,Min,step=0;
pos p;
int board[101][101]; void DFS(pos p)
{
int i;
if(step>=10) //step大于等于10时,不能走了,剪枝,回退
return;
if(p.x+1<h&&board[p.x+1][p.y]!=1) //如果下一步不是石头,且不越界,就走试试看
{
step++;
for(i=1;i<h-p.x&&board[i+p.x][p.y]!=1;i++) //一步一步验证是否能到终点,是否碰到石头
{
if(board[i+p.x][p.y]==3) //到达终点,如果step比当前最小值小,保存step的值
{
if(Min>step)
Min=step;
step--;
return;
}
}
if(i<h-p.x) //如果不划出边界
{
board[i+p.x][p.y]=0; //碰到的石头变成空白
p.x+=i-1; //移动到当前位置
DFS(p);
board[p.x+1][p.y]=1;
p.x-=i-1;
}
step--;
}
if(p.x-1>=0&&board[p.x-1][p.y]!=1)
{ step++;
for(i=1;i<=p.x&&board[p.x-i][p.y]!=1;i++)
{
if(board[p.x-i][p.y]==3)
{
if(Min>step)
Min=step;
step--;
return;
}
}
if(i<=p.x)
{
board[p.x-i][p.y]=0;
p.x-=i-1;
DFS(p);
board[p.x-1][p.y]=1;
p.x+=i-1;
}
step--;
}
if(p.y+1<w&&board[p.x][p.y+1]!=1)
{
step++;
for(i=1;i<w-p.y&&board[p.x][p.y+i]!=1;i++)
{
if(board[p.x][p.y+i]==3)
{
if(Min>step)
Min=step;
step--;
return;
}
}
if(i<w-p.y)
{
board[p.x][p.y+i]=0;
p.y+=i-1;
DFS(p);
board[p.x][p.y+1]=1;
p.y-=i-1;
}
step--;
}
if(p.y-1>=0&&board[p.x][p.y-1]!=1)
{
step++;
for(i=1;i<=p.y&&board[p.x][p.y-i]!=1;i++)
{
if(board[p.x][p.y-i]==3)
{
if(Min>step)
Min=step;
step--;
return;
}
}
if(i<=p.y)
{
board[p.x][p.y-i]=0;
p.y-=i-1;
DFS(p);
board[p.x][p.y-1]=1;
p.y+=i-1;
}
step--;
}
return;
} int main()
{
while(cin>>w>>h&&(w+h))
{
Min=11;
int i,j;
step=0;
memset(board,0,sizeof(board));
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
cin>>board[i][j];
if(board[i][j]==2)
{
p.x=i;
p.y=j;
}
}
}
DFS(p);
if(Min==11)
cout<<-1<<endl;
else
cout<<Min<<endl; }
}
HDOJ-三部曲一(搜索、数学)-1003-Curling 2.0的更多相关文章
- Curling 2.0 分类: 搜索 2015-08-09 11:14 3人阅读 评论(0) 收藏
Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14289 Accepted: 5962 Descript ...
- 51Nod 1003 阶乘后面0的数量(数学,思维题)
1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720 ...
- 【POJ - 3009】Curling 2.0 (dfs+回溯)
-->Curling 2.0 直接上中文 Descriptions: 今年的奥运会之后,在行星mm-21上冰壶越来越受欢迎.但是规则和我们的有点不同.这个游戏是在一个冰游戏板上玩的,上面有一个正 ...
- POJ3009——Curling 2.0(DFS)
Curling 2.0 DescriptionOn Planet MM-21, after their Olympic games this year, curling is getting popu ...
- poj 3009 Curling 2.0 (dfs )
Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11879 Accepted: 5028 Desc ...
- 【POJ】3009 Curling 2.0 ——DFS
Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11432 Accepted: 4831 Desc ...
- Curling 2.0(dfs回溯)
Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15567 Accepted: 6434 Desc ...
- ****Curling 2.0(深搜+回溯)
Curling 2.0 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total ...
- 1001 数组中和等于K的数对 1002 数塔取数问题 1003 阶乘后面0的数量 1004 n^n的末位数字 1009 数字1的数量
1001 数组中和等于K的数对 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K ...
- POJ 3009:Curling 2.0 推箱子
Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14090 Accepted: 5887 Desc ...
随机推荐
- zoj 1204 Additive equations
ACCEPT acm作业 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=204 因为老师是在集合那里要我们做这道题.所以我很是天 ...
- python获取文件时间
import time, os create_time = time.ctime(os.path.getctime(filename)) modify_time = time.ctime(os.pat ...
- CF---(452)A. Eevee
A. Eevee time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- 使用 Fresco加载图片
概念: ImagePipeline ——负责从网络.本地图片.Content Provider(内容提供者)或者本地资源那里获取图片,压缩保存在本地存储中和在内存中保存为压缩的图片 Drawee——处 ...
- Stylus Studio的安装与卸载
- Java 8的五大开发技巧
转载:http://geek.csdn.net/news/detail/94219 在Java 9发布之前,我们来分享一些Java 8开发技巧,本文翻译自JetBrains高级开发主管Trisha G ...
- discuz 同步登录问题
最近一直在搞discuz论坛的二次开发,发现在论坛登录或退出的时候应用却没有同步登录或同步退出,这下子麻烦了,后来查看,原来没有产生js的同步代码,查找原因,发现$_G['setting']['all ...
- mark 一下
Android资源管理框架(Asset Manager)简要介绍和学习计划 http://www.cnblogs.com/hjtdlx/p/4332060.html
- LCD驱动 15 -2
1.分配一个fb_info结构体: framebuffer_alloc 2.设置 3.注册 4.硬件相关操 struct fb_fix_screeninfo { char id[16]; /* i ...
- visualSVN server库迁移
首先,VisualSVN Server Manager,包含两个路径,一个是安装路径,例如本机:C:\Program Files\VisualSVN Server,一个是库路径,例如本机:C:\Rep ...