九度 1335

http://ac.jobdu.com/problem.php?id=1335

开始时傻傻的用DFS,不断超时,不断剪枝,仍不断超时,最后用BFS,先是保存路径,最后求路径长,仍超时,无意中翻到算法导论,也是,题目中没让打印路径,直接记录长度即可,于是把代码一改,结果10个数据过5个,这时我不再怀疑算法的问题了,检查了一遍,发现queue<int> Q开成了全局变量,这样一来,如果上次在队列没空之前找到了出口,队列中会遗留结点,导致下一次的数据出错,改过来,AC,看了下榜,用的内存还算少的~

indent不太会用,把代码格式化的有些乱,毕竟是从机房那边VC弄过后邮件发过来的,空格什么的都乱了

 1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <queue>
5 using namespace std;
6 bool mat[102][102];
7 int visited[102][102] = { 0 };
8
9 queue < int >Q;
10
11 int x_pos[] = { 0, 0, -1, 1 };
12 int y_pos[] = { -1, 1, 0, 0 };
13
14 int n;
15
16 void
17 bfs ()
18 {
19 int x, y, i;
20 while (!Q.empty ())
21 {
22
23 x = Q.front ();
24 Q.pop ();
25 y = Q.front ();
26 Q.pop ();
27
28 if (x == n && y == n)
29 { //find it
30 break;
31 }
32 //visited[x][y]++;
33 for (i = 0; i < 4; i++)
34 {
35 if (!visited[x + x_pos[i]][y + y_pos[i]]
36 && !mat[x + x_pos[i]][y + y_pos[i]])
37 {
38 Q.push (x + x_pos[i]);
39 Q.push (y + y_pos[i]);
40 visited[x + x_pos[i]][y + y_pos[i]] = visited[x][y] + 1;
41
42 }
43 }
44 }
45 }
46
47
48 int
49 main ()
50 {
51 while (scanf ("%d", &n) != EOF)
52 {
53 int i, j;
54 while (!Q.empty ())
55 Q.pop ();
56
57 memset (mat, true, sizeof (mat));
58 memset (visited, false, sizeof (visited)); //init
59
60 for (i = 0; i <= n + 2; i++)
61 for (j = 1; j <= n + 2; j++)
62 mat[i][j] = true;
63 for (i = 1; i <= n; i++)
64 for (j = 1; j <= n; j++)
65 {
66 int temp;
67 scanf ("%d", &temp);
68 if (temp == 1)
69 mat[i][j] = true;
70 else
71 mat[i][j] = false;
72 }
73 if (mat[1][1] || mat[n][n])
74 {
75 printf ("-1\n");
76 continue;
77 }
78 if (n == 1 && !mat[1][1])
79 {
80 printf ("0\n");
81 continue;
82 }
83 Q.push (1);
84 Q.push (1);
85 bfs ();
86
87 if (!visited[n][n])
88 {
89 printf ("-1\n");
90 continue;
91 }
92
93 printf ("%d\n", visited[n][n]);
94 }
95 }
原文地址:https://www.cnblogs.com/yangce/p/2260004.html