poj 3009 Curling 2.0 【DFS】

题意:从2出发,要到达3, 0可以通过,碰到1要停止,并且1处要变成0, 并且从起点开始沿着一个方向要一直前进,直至碰到1(或者3)处才能停止,(就是反射来反射去知道反射经过3).如果反射10次还不能到达3,就输出-1.

策略:深搜。

易错点,方向不容易掌握,并且,出题人把n, m顺序反了。

代码:

#include<stdio.h>
#include<string.h>
int map[25][25];
int ans, n, m;
const int dir[4][2] = {0, -1, 0, 1, 1, 0, -1, 0};//方向
int limit(int x, int y)
{
	return (x>0&&x<=n&&y>0&&y<=m);//注意:x是小于等于m y是小于等于n
}
void dfs(int x, int y, int step)
{
	if(step >= 10) return;
	int i, nx, ny;
	for(i = 0; i < 4; i ++){
		nx = x+dir[i][0];
		ny = y+ dir[i][1];
		if(limit(nx, ny)&&map[nx][ny] != 1){ //判断是不是1,如果不是1,就朝该方向前进
			while(limit(nx, ny)&&map[nx][ny] != 1&&map[nx][ny] != 3){//碰到1或3停止
				nx += dir[i][0];
				ny += dir[i][1];
			}
			if(map[nx][ny] == 3){
				if(ans > step+1){
					ans = step+1;
				}
				return;//碰到3就停止
			}
			else if(map[nx][ny] == 1){
				map[nx][ny] = 0;
				dfs(nx-dir[i][0], ny-dir[i][1], step+1);
				map[nx][ny] = 1;
			}
		}
	}
}
int main()
{
	int i, j, sx, sy;
	while(scanf("%d%d", &m, &n), n||m){
		memset(map, 0, sizeof(map));//一定要初始化啊,此处贡献了n个wa
		for(i = 1; i <= n; i ++){
			for(j = 1; j <= m; j ++){
				scanf("%d", &map[i][j]);
				if(map[i][j] == 2){//找到2点的坐标
					sx = i;
					sy = j;
				}
			}
		}
		ans = 0x3f3f3f3f;//初始化
		dfs(sx, sy, 0);
		if(ans > 10){
			printf("-1\n");
		}
		else{
			printf("%d\n", ans);
		}
	}
} 

题目链接:http://poj.org/problem?id=3009

poj 3009 Curling 2.0 【DFS】,布布扣,bubuko.com

时间: 2024-10-12 20:54:36

poj 3009 Curling 2.0 【DFS】的相关文章

POJ 3009 Curling 2.0 回溯,dfs 难度:0

http://poj.org/problem?id=3009 如果目前起点紧挨着终点,可以直接向终点滚(终点不算障碍) #include <cstdio> #include <cstring> using namespace std; const int maxn = 21; int maz[maxn][maxn]; int n,m; const int dx[4] = {1,-1,0,0}; const int dy[4] = {0,0,1,-1}; bool in(int x,

POJ3009 Curling 2.0【DFS】

题目链接: http://poj.org/problem?id=3009 题目大意: 一种在宽为M高为N大小的矩阵上玩的冰壶游戏,起点字符为'2',终点字符为'3',矩阵上'0'为可移动区域, '1'为石头区域.冰壶刚开始是静止的,每走一步都会选择某个方向运动,而且会沿着该方向一直运动不停, 也不会改变方向,除非冰壶碰到石头或者到达终点,才会停下(这算一步).冰壶在运动的时候,不能改变方 向.冰壶碰到石头会变成静止状态,这时候石头会破裂,该区域变为可移动区域,而冰壶就可以改变方向了. 冰壶一旦走

POJ 3009 Curling 2.0 简单DFS 好题

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

POJ 3009 Curling 2.0 (dfs)

Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12700   Accepted: 5343 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

poj 3009 Curling 2.0 (dfs )

Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11879   Accepted: 5028 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

poj 3009 Curling 2.0 (dfs)

id=3009">链接:poj 3009 题意:在一个冰面网格板上,有空白处(无障碍),和障碍块.有一个小石头,给定其起点和终点.求从起点到终点的最小步数 规则:小石头不能在障碍区运动,一旦从某一方向開始运动,不会改变方向,也不会停止.除非碰到障碍物或到达终点才会停止,这为一步.若碰到障碍物.小石头将停在障碍物的旁边,被碰到的一个障碍物将消失. 输入:1代表障碍物(不可到达),0代表空白区,2,代表起点.3代表终点 输出:若小石头能到达终点,且步数最多为十步,输出最小步数,否则输出-1.

poj 3009 Curling 2.0 dfs回溯

// poj3009 Curling 2.0 // dfs水题,开始的时候没有想到在走了10步以后就不走了这个重要的剪枝, // 结果tle了... // 后来想了个vis数组记录走过的路径,结果发现并不能这样标记,因为每个点可能 // 走多次,所以这样是不对的 // // 哎,继续练吧,水题都差不多搜了一个小时,哎,... #include <algorithm> #include <bitset> #include <cassert> #include <cc

dfs/poj 3009 Curling 2.0

1 #include<cstdio> 2 using namespace std; 3 4 const int dx[4]={0,1,0,-1}; 5 const int dy[4]={1,0,-1,0}; 6 7 int m,n,ans,ex,ey,sx,sy; 8 int a[22][22]; 9 10 int cmin(int a,int b) {return a<b?a:b;} 11 12 bool pd(int xx,int yy) 13 { 14 if (xx>=1 &

POJ 3009 Curling 2.0冰壶游戏(dfs)

条件:要移动的方向旁边有障碍物时不能动 来自 http://blog.sina.com.cn/s/blog_7865b08301013fku.html 的代码,感叹下自己代码的渣渣 1 int map[MAX][MAX] ; 2 int h, w , min = INT_MAX ; 3 int sx , sy , ex, ey ; 4 int d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; 5 void init(){ 6 for(int i = 0 ;i < h