hdu 4740【模拟+深搜】.cpp

题意:

  给出老虎的起始点、方向和驴的起始点、方向..

  规定老虎和驴都不会走自己走过的方格,并且当没路走的时候,驴会右转,老虎会左转..

  当转了一次还没路走就会停下来..

  

  问他们有没有可能在某一格相遇..

思路:

  模拟,深搜..

  用类似时间戳的东西给方格标记上,表示某一秒正好走到该方格..

  最后遍历一下驴在某一格方格标记时间是否和老虎在该格标记的时间一样,一样代表正好做过这里了..

  还有一种情况就是老虎或驴一直停在那里,那就算不相等,也是可以的..

Tips:

  我一直忘了老虎或驴停下来的情况,这样只要该方格正好是时间戳最后一秒,而且另一个动物走过的时间比停下来那一个动物的最后一秒大就表示一个停下来后和另一个相遇了..

  我的方法是两个dfs分别记录下老虎和驴走过的每一秒所到位置..

  而网上更快的方法是用一个dfs,计算该秒老虎和驴走到的位置,如果正好相等就相遇了..

  这样的话就不必遍历完整个路程,所以时间复杂度比我的低~~~~

Code:

  1 /******************************************
  2 *Author:         Griselda
  3 *Created Time:   2013-12-10 22:57
  4 *Filename:       4740.cpp
  5 * ****************************************/
  6 #include <stdio.h>
  7 #include <cstring>
  8 #include <algorithm>
  9 using namespace std;
 10 const int MAXN = 1010;
 11 const int INF = 0x1f1f1f1f;
 12 
 13 int visd[MAXN][MAXN], vist[MAXN][MAXN];
 14 int n, t, d;
 15 
 16 bool check(int x, int y) {
 17     return x >= 0 && x < n && y >= 0 && y < n;
 18 }    
 19 
 20 void dfsd(int x, int y, int c)
 21 {
 22     if (!check(x, y) || visd[x][y] != -1) return;
 23     visd[x][y] = d++;
 24     if (c == 0) {
 25         int i;
 26         for (i = y+1; i < n; ++i) 
 27            if (visd[x][i] == -1) {
 28               visd[x][i] = d++;
 29            } else {
 30                dfsd(x+1, i-1, 1); 
 31                break;
 32            }
 33         if (i == n) dfsd(x+1, n-1, 1);
 34     } else if (c == 1) {
 35         int i;
 36         for (i = x+1; i < n; ++i)
 37             if (visd[i][y] == -1) visd[i][y] = d++;
 38             else {
 39                 dfsd(i-1, y-1, 2);
 40                 break;
 41             }
 42         if (i == n) dfsd(n-1, y-1, 2);
 43     } else if (c == 2) {
 44         int i;
 45         for (i = y-1; i >= 0; --i)
 46             if (visd[x][i] == -1) visd[x][i] = d++;
 47             else {
 48                 dfsd(x-1, i+1, 3);
 49                 break;
 50             }
 51         if (i == -1) dfsd(x-1, 0, 3);
 52     } else {
 53         int i;
 54         for (i = x-1; i >= 0; --i)
 55             if (visd[i][y] == -1) visd[i][y] = d++;
 56             else {
 57                 dfsd(i+1, y+1, 0);
 58                 break;
 59             }
 60         if (i == -1) dfsd(0, y+1, 0);
 61     }
 62 }
 63 
 64 void dfst(int x, int y, int c)
 65 {
 66     if (!check(x, y) || vist[x][y] != -1) return;
 67         vist[x][y] = t++;
 68     if (c == 0) {
 69         int i;
 70         for (i = y+1; i < n; ++i) 
 71            if (vist[x][i] == -1) {
 72               vist[x][i] = t++;
 73            } else {
 74                dfst(x-1, i-1, 3); 
 75                break;
 76            }
 77         if (i == n) dfst(x-1, n-1, 3);
 78     } else if (c == 1) {
 79         int i;
 80         for (i = x+1; i < n; ++i) 
 81             if (vist[i][y] == -1) vist[i][y] = t++;
 82             else {
 83                 dfst(i-1, y+1, 0);
 84                 break;
 85             }
 86         if (i == n) dfst(n-1, y+1, 0);
 87     } else if (c == 2) {
 88         int i;
 89         for (i = y-1; i >= 0; --i) 
 90             if (vist[x][i] == -1) vist[x][i] = t++;
 91             else {
 92                 dfst(x+1, i+1, 1);
 93                 break;
 94              }
 95         if (i == -1) dfst(x+1, 0, 1);
 96     } else {
 97         int i;
 98         for (i = x-1; i >= 0; --i) 
 99             if (vist[i][y] == -1) vist[i][y] = t++;
100             else {
101                 dfst(i+1, y-1, 2);
102                 break;
103             }
104         if (i == -1) dfst(0, y-1, 2);
105     }
106 }
107 
108 int main()
109 {
110     //freopen("in.txt", "r", stdin);
111     //freopen("out1.txt", "w", stdout);
112     int a, b, c, x, y, z;
113     int ans, ansx, ansy;
114     while (~scanf("%d", &n)) {
115         if (n == 0) break;
116         ans = INF;
117         memset(visd, 0xff, sizeof(visd));
118         memset(vist, 0xff, sizeof(vist));
119         t = d = 0;
120         scanf("%d %d %d", &a, &b, &c);
121         scanf("%d %d %d", &x, &y, &z);
122         dfsd(a, b, c);
123         dfst(x, y, z);
124         /*
125         for (int i = 0; i < n; ++i)
126             for (int j = 0; j < n; ++j)
127                 printf("%3d%c", visd[i][j], j == n-1?'
':' ');
128         puts("**********************");
129         for (int i = 0; i < n; ++i)
130             for (int j = 0; j < n; ++j)
131                 printf("%3d%c", vist[i][j], j == n-1?'
':' ');
132         */
133 
134         for (int i = 0; i < n; ++i)
135             for (int j = 0; j < n; ++j)
136                 if ((vist[i][j] == visd[i][j] && ans > vist[i][j] && vist[i][j] != -1) ||
137                     (vist[i][j] == t-1 && visd[i][j] > t-1 ) ||
138                        (visd[i][j] == d-1 && vist[i][j] > d-1)) {
139                     ansx = i, ansy = j;
140                     ans = vist[i][j];
141                 }
142         if (ans == INF) puts("-1");
143         else printf("%d %d
", ansx, ansy);
144     }
145     return 0;
146 }
View Code

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4740

原文地址:https://www.cnblogs.com/Griselda/p/3471022.html