您的位置:首页 > 其它

POJ-3009 Curling 2.0

2015-08-06 15:14 260 查看
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 25;
int maze[maxn][maxn];
int stp[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
int w, h, ans, flag;
struct Maze
{
int x;
int y;
};
Maze start;

bool judge(int x, int y)
{
if(x >= 0 && y >= 0 && x < w && y < h)
return true;
else
return false;
}
void dfs(Maze temp, int step)
{
if(step > 10)
return ;
for(int i = 0; i < 4; i ++)
{
int nx = temp.x + stp[i][0];
int ny = temp.y + stp[i][1];
int t = 0;
while(judge(nx, ny) && maze[nx][ny] == 0)
{
nx += stp[i][0];
ny += stp[i][1];
t ++;
}
if(judge(nx, ny) && maze[nx][ny] == 3)
{
if(step + 1 > 10)
return ;
if(ans == -1)
ans = step + 1;
else
ans = min(ans, step + 1);
return ;
}
if(t > 0)
{
if(judge(nx, ny))
{
Maze next;
next.x = nx - stp[i][0];
next.y = ny - stp[i][1];
maze[nx][ny] = 0;
dfs(next, step + 1);
maze[nx][ny] = 1;
}
}
}
}

int main()
{
while(~scanf("%d %d", & w, & h))
{
if(!w && !h)
break;
memset(maze, 0, sizeof(maze));
for(int i = 0; i < h; i ++)
{
for(int j = 0; j < w; j ++)
{
scanf("%d", & maze[j][i]);
if(maze[j][i] == 2)
{
start.x = j;
start.y = i;
maze[j][i] = 0;
}
}
}
ans = -1;
dfs(start, 0);
cout << ans << endl;
}
}

题意:算是一种冰壶游戏吧。也是一个格子棋盘。确定初始位置和终点位置。棋子选择一个方向一直前进。直到碰到墙 又可以重新选择上下左右四个方向中的一个。如果出界不计 此方法失败。直到棋子到达终点。如果步数超过10步 失败。失败结果输出-1。输出成功步数最小值。

题解:dfs吧。刚开始 参考别人的思路。就是一直递归找。应该也挺好看懂的。为了方便 判断是否在界内写成了函数。还有注意找到初始位置后 将初始位置的2变为0!(一开始没考虑到。如果不变0..2就变成挡路的了..)还有就是step+1得放在下一个dfs中加。每一步都不能落下判断是否越界..否则程序崩溃..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: