1.http://acm.hdu.edu.cn/showproblem.php?pid=1312

题意:在一个仅有红黑格子组成的矩形中,一个人只能走上下左右相邻黑色格子,问从起点开始共能走多少个格子?

’#‘:红色格子

’.': 黑色格子;

’@‘:起点 

BFS 和 DFS 都可以遍历所有走的点,每次走过一点时,计数++即可;

 

 

2.http://acm.hdu.edu.cn/showproblem.php?pid=1728

由题可知,在限制转弯数量的前提下 能够从一点走到另一个点即可;BFS 和 DFS都能求出解。我 DFS 还没实现

需要注意:1.点坐标是从 1 开始的。

     2.最短的路径可能不满足转弯数的限制。

     3.起点与终点重合。

超内存代码:已找到原因,完全是大意所致。贴在此处,希望自己以后再看时能一眼找到。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 using namespace std;
 5 #define N 105
 6 
 7 struct Pos
 8 {
 9     int x, y;
10     int turn;
11     int dire;
12 }S, E;
13 char map[N][N];
14 bool used[N][N][12][4];
15 int dir[][2]={1,0, -1,0, 0,1, 0,-1};
16 int n, m, k;
17 
18 bool Judge (Pos s)
19 {
20     if (s.x>=1 && s.x<=m && s.y>=1 && s.y<=n && map[s.x][s.y]=='.' && !used[s.x][s.y][S.turn][S.dire] && s.turn <= k)
21         return true;
22     return false;
23 }
24 
25 bool  bfs ()
26 {
27     Pos Pre, Cur;
28     queue <Pos> Q;
29     while (!Q.empty ()) Q.pop();
30     memset (used, 0, sizeof used);
31 
32     S.dire = -1;
33     S.turn = 0;
34     used[S.x][S.y][S.turn][S.dire] = true;
35     Q.push (S);
36     while (!Q.empty ())
37     {
38         Pre = Q.front ();
39         Cur = Pre;
40         Q.pop();
41         if (Cur.x==E.x && Cur.y==E.y)
42             return true;
43         for(int i=0; i<4; i++)
44         {
45             Cur.x = Pre.x + dir[i][0];
46             Cur.y = Pre.y + dir[i][1];
47             Cur.turn = Pre.turn;
48             Cur.dire = i;
49             if (Cur.dire != Pre.dire && Pre.dire !=-1)
50                 Cur.turn++;
51             if (Judge (Cur))
52             {
53                 used[Cur.x][Cur.y][Cur.turn][Cur.dire] = true;
54                 Q.push (Cur);
55             }
56         }
57     }
58     return false;
59 }
60 
61 int main ()
62 {
63     int t;
64 //    freopen ("test.txt","r",stdin);
65     scanf ("%d",&t);
66     while (t--)
67     {
68         scanf ("%d%d",&m, &n);
69         for (int i=1; i<=m; i++)
70             for (int j=1; j<=n; j++)
71                 scanf (" %c", map[i]+j);
72         scanf ("%d%d%d%d%d",&k, &S.y, &S.x, &E.y, &E.x);
73 
74         puts ((bfs ()?"yes":"no"));
75     }
76     return 0;
77 }
View Code

相关文章: