POJ-3009 Curling 2.0 (深搜)

原创 2013年12月05日 12:27:36

Curling 2.0
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 9347   Accepted: 3950

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.

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

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.

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 <stdio.h>
#include <string.h>
#define N 25

struct Node{
	int x;
	int y;
	int s;
};

int m, n, S;
char map[N][N];
int fx[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};

void dfs(Node cur);
void getNode(Node &cur, int fxi);

int main()
{
	int i, j;
	while(scanf("%d%d", &m, &n) && m && n){
		S = 0xfffffff;
		Node start;
		memset(map, '#', sizeof(map));
		for(i = 1; i <= n; i ++){
			for(j = 1; j <= m; j ++){
				scanf(" %c", &map[i][j]);
				if(map[i][j] == '2'){
					start.x = i;
					start.y = j;
					start.s = 0;
					map[i][j] = '0';
				}
			}
		}
		dfs(start);
		if(S == 0xfffffff) printf("-1\n");
		else printf("%d\n", S);
	}

	return 0;
}

void dfs(Node cur)
{
	cur.s ++;
	if(cur.s > 10 || cur.s >= S)
		return;
	Node nw;
	int i, j;
	for(i = 0; i < 4; i ++){
		nw = cur;
		getNode(nw, i);
		if(map[nw.x][nw.y] == '1' || map[nw.x][nw.y] == '#')
			continue;
		switch(i){
			case 0:
				for(j = nw.y; j <= m; j ++){
					if(map[nw.x][j] == '0')
						continue;
					else if(map[nw.x][j] == '3'){
						if(S > cur.s)
							S = cur.s;
						return;
					}
					else if(map[nw.x][j] == '1'){
						nw.y = j - 1;
						map[nw.x][j] = '0';
						dfs(nw);
						map[nw.x][j] = '1';
						break;
					}
				}
				break;
			case 1:
				for(j = nw.x; j <= n; j ++){
					if(map[j][nw.y] == '0')
						continue;
					else if(map[j][nw.y] == '3'){
						if(S > cur.s)
							S = cur.s;
						return;
					}
					else if(map[j][nw.y] == '1'){
						nw.x = j - 1;
						map[j][nw.y] = '0';
						dfs(nw);
						map[j][nw.y] = '1';
						break;
					}
				}
				break;
			case 2:
				for(j = nw.y; j >= 1; j --){
					if(map[nw.x][j] == '0')
						continue;
					else if(map[nw.x][j] == '3'){
						if(S > cur.s)
							S = cur.s;
						return;
					}
					else if(map[nw.x][j] == '1'){
						nw.y = j + 1;
						map[nw.x][j] = '0';
						dfs(nw);
						map[nw.x][j] = '1';
						break;
					}
				}
				break;
			case 3:
				for(j = nw.x; j >= 1; j --){
					if(map[j][nw.y] == '0')
						continue;
					else if(map[j][nw.y] == '3'){
						if(S > cur.s)
							S = cur.s;
						return;
					}
					else if(map[j][nw.y] == '1'){
						nw.x = j + 1;
						map[j][nw.y] = '0';
						dfs(nw);
						map[j][nw.y] = '1';
						break;
					}
				}
				break;
		}
	}
}

void getNode(Node &cur, int fxi)
{
	cur.x += fx[fxi][0];
	cur.y += fx[fxi][1];
}



Curling 2.0 (深搜)

Curling 2.0 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Tot...
  • sinat_37668729
  • sinat_37668729
  • 2017年08月04日 11:28
  • 57

【POJ3009】Curling 2.0(深搜)

题目大意: 深搜各个方向,细节见代码。
  • can919
  • can919
  • 2017年06月24日 21:28
  • 66

深搜和广搜的概念和设计思想(贪心+动态规划+最大堆)

广搜和深搜大多用于图的搜索,但是也不仅仅用于此,因为这是一种思想,所以应该理论上可以用于所有合适的数据结构类型。 深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比...
  • modiziri
  • modiziri
  • 2014年08月19日 10:05
  • 876

深搜和广搜简单对比

深搜和广搜在实现上分别用的是栈(函数递归本质是一样)和队列。广搜一般对于寻找最优解的情况有比较好的时间控制,但是比较消耗内存。相反深搜却比较省内存但在时间上会有所消耗! 各种动态的表示和形象化的动态...
  • A948433271
  • A948433271
  • 2015年07月24日 21:01
  • 2949

深搜与广搜的特点

一、深度优先搜索的特点是:         (1)深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。当数据量较...
  • lisp1995
  • lisp1995
  • 2016年08月23日 12:46
  • 835

二叉树的深搜与广搜

我们来讲解今天的主题之深搜 先来看看深搜 深搜:10 8 5 1 2 6 3 4 9 7 广搜:10 8 9 5 6 7 1 2 3 4 大家对照着图结合开...
  • u011613367
  • u011613367
  • 2016年03月23日 20:07
  • 1495

图及其深搜广搜

基本概念 一般用G=(V,E)表示,包括一个点集和边集。 **概念**:稠密图、稀疏图、完全图;有向图与无向图;带权图与无权图; 表示方法:一般用**邻接矩阵**和**邻接表**(另有**十字链表...
  • u012440687
  • u012440687
  • 2016年08月21日 10:04
  • 280

迭代深搜+A*(IDA*)

HDU 2234 无题I 题目意思中文的也就不用翻译了; 广搜由于要记录大量的状态因此耗费的空间比较大,深搜由于要遍历所有的状态,所以耗费的时间就比较高; A*算法就相当于普通的搜索算法加了一个...
  • ACMer_ZP
  • ACMer_ZP
  • 2017年01月15日 15:37
  • 204

广搜与深搜的区别

原网址:http://www.cnpetweb.com/a/xinxizhongxin/lanmu9/2011/0729/1477.html 一般来说,广搜常用于找单一的最短路线,或者是规模小的...
  • chao1983210400
  • chao1983210400
  • 2014年03月13日 11:02
  • 1160

深搜和广搜算法

深搜和广搜算法思想 本文转载自:http://blog.csdn.net/bool_isprime/archive/2010/08/11/5803018.aspx ...
  • lh__huahuan
  • lh__huahuan
  • 2015年03月25日 20:36
  • 3592
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ-3009 Curling 2.0 (深搜)
举报原因:
原因补充:

(最多只允许输入30个字)