POJ 3009 Curling 2.0(棋盘DFS)

Curling 2.0
 

大意:

就是要求把一个冰壶从起点“2”用最少的步数移动到终点“3”

其中0为移动区域,1为石头区域,冰壶一旦想着某个方向运动就不会停止,也不会改变方向(想想冰壶在冰上滑动),除非冰壶撞到石头1 或者 到达终点 3

冰壶撞到石头后,冰壶会停在石头前面,此时(静止状态)才允许改变冰壶的运动方向,而该块石头会破裂,石头所在的区域由1变为0. 也就是说,冰壶撞到石头后,并不会取代石头的位置。

终点是一个摩擦力很大的区域,冰壶若到达终点3,就会停止在终点的位置不再移动。

 

思路:

DFS的水题    中间由于变量初始化放错位置了, WA了好几次。

 
  1 #include <Map>
  2 #include <stack>
  3 #include <queue>
  4 #include <math.h>
  5 #include <stdio.h>
  6 #include <string.h>
  7 #include <iostream>
  8 #include <limits.h>
  9 #include <algorithm>
 10 #define LL long long
 11 #define min(a,b) (a>b?b:a)
 12 #define max(a,b) (a>b?a:b)
 13 #define eps 1e-9
 14 #define INF 1 << 30
 15 using namespace std;
 16 
 17 int dx[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
 18 
 19 int Ans = 20;
 20 int n, m;
 21 int Map[30][30];
 22 int begin_x, begin_y;
 23 
 24 void Dfs(int x, int y, int depth)
 25 {
 26     int n_x, n_y;
 27     if(depth > 10)
 28         return ;
 29     for(int i = 0; i < 4; i++)
 30     {
 31         int flag = 0;
 32         if(Map[x+dx[i][0]][y+dx[i][1]] == 1)
 33             continue;
 34         n_x = x;
 35         n_y = y;
 36         while(1)
 37         {
 38             n_x += dx[i][0];
 39             n_y += dx[i][1];
 40             if(n_x >= 1 && n_x <= n && n_y >= 1 && n_y <= m)
 41             {
 42                 if(Map[n_x][n_y] == 3)
 43                 {
 44                     if(Ans > depth)
 45                     {
 46                         Ans = depth;
 47                     }
 48                     return ;
 49                 }
 50                 else if(Map[n_x][n_y] == 1)
 51                 {
 52                     break;
 53                 }
 54             }
 55             else
 56             {
 57                 flag = 1;
 58                 break;
 59             }
 60         }
 61         if(flag == 1)
 62             continue;
 63         Map[n_x][n_y] = 0;
 64         Dfs(n_x-dx[i][0], n_y-dx[i][1], depth+1);
 65         Map[n_x][n_y] = 1;
 66     }
 67 }
 68 
 69 void run()
 70 {
 71     while(~scanf("%d%d", &m, &n))
 72     {
 73         if(!m && !n)
 74             break;
 75         memset(Map, 0, sizeof(Map));
 76         for(int i = 1; i <= n; i++)
 77         {
 78             for(int j = 1; j <= m; j++)
 79             {
 80                 scanf("%d", &Map[i][j]);
 81                 if(Map[i][j] == 2)
 82                 {
 83                     begin_x = i;
 84                     begin_y = j;
 85                     Map[i][j] = 0;
 86                 }
 87             }
 88         }
 89         Ans = 500;
 90         Dfs(begin_x, begin_y, 1);
 91         if(Ans == 500)
 92             printf("-1\n");
 93         else
 94             printf("%d\n", Ans);
 95     }
 96 }
 97 
 98 int main(void)
 99 {
100     run();
101 
102     return 0;
103 }
Curling 2.0

 

posted @ 2013-12-10 19:22  GLSilence  阅读(190)  评论(0编辑  收藏  举报