Uva 705 - Slash Maze

题目的意思是在图中寻找可以构成的回路数,及最大回路经过的格子数。

题目不是简单的横竖的格子,而是斜的,这样就不太容易了。后来上网看别人的思路,把图放大三倍,就豁然开朗了。

解题报告链接:http://blog.csdn.net/sio__five/article/details/18910097

代码我修改了一下,留着自己以后慢慢学习。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 int length, width, grid, Max;
 7 int g[300][300], isVis[300][300];
 8 int Move[4][2] = {{0, -1},{0, 1} , {-1, 0} ,{1, 0}};
 9 
10 bool IsIn(int x, int y);
11 void NoEffectFill(int x, int y);
12 void SetBound();
13 void Dfs(int x, int y);
14 
15 int main ()
16 {
17 //    freopen("D:\\acm.txt","r",stdin);
18     int No = 1,cycleNum;
19     while(cin>>length>>width,(length||width)){
20         width = width * 3, length = length * 3;//将图放大三倍
21         memset(g,0,sizeof(g));
22         memset(isVis, 0,sizeof(isVis));
23         Max = 0;
24         cycleNum = 0;
25         for (int i = 1; i < width; i += 3){
26             for (int j = 1; j < length; j += 3){
27                 char ch;
28                 cin>>ch;
29                 if (ch == '\\')
30                     g[i - 1][j - 1] = g[i][j] = g[i + 1][j + 1] = 1;
31                 else
32                 g[i - 1][j + 1] = g[i][j] = g[i + 1][j - 1] = 1;
33             }
34         }
35         SetBound();
36         for (int i = 0; i < width; i++){
37             for (int j = 0; j < length; j++){
38                 if (!g[i][j] && !isVis[i][j]){
39                     grid = 0;
40                     Dfs(i, j);
41                     if (grid >= 12) cycleNum++;//小格子大于12即大格子大于4,构成一个回路
42                     if (grid > Max) Max = grid;//记录最大格子数目
43                 }
44             }
45         }
46         printf("Maze #%d:\n", No++);
47         if(cycleNum != 0)
48             printf("%d Cycles; the longest has length %d.\n", cycleNum, Max / 3);
49         else
50             printf("There are no cycles.\n");
51         printf("\n");
52     }
53     return 0;
54 }
55 bool IsIn(int x, int y)
56 {
57     return (x >= 0 && x < width && y >= 0 && y < length);
58 }
59 void NoEffectFill(int x, int y)
60 {
61     int nextX, nextY, i;
62     isVis[x][y] = 1, g[x][y] = 2;
63     for (i = 0; i < 4; i++){//将外围的空格填充掉
64         nextX = x + Move[i][0];
65         nextY = y + Move[i][1];
66         if (IsIn(nextX, nextY) && !isVis[nextX][nextY] && !g[nextX][nextY])
67             NoEffectFill(nextX, nextY);
68     }
69 }
70 void SetBound()
71 {
72     for (int i = 0; i < width; i++){
73         if (!g[i][0] && !isVis[i][0]) 
74             NoEffectFill(i, 0);//设置图的外围边界
75         if (!g[i][length - 1] && !isVis[i][length - 1]) 
76             NoEffectFill(i, length - 1);
77     }
78     for (int j = 0; j < length; j++){
79         if (!g[0][j] && !isVis[0][j])
80             NoEffectFill(0, j);//设置图的外围边界
81         if (!g[width - 1][j] && !isVis[width - 1][j]) 
82             NoEffectFill(width - 1, j);
83     }
84 }
85 void Dfs(int x, int y)//递归寻找格子
86 {
87     int nextX, nextY;
88     isVis[x][y] = 1;
89     grid++;
90     for (int i = 0; i < 4; i++){
91         nextX = x + Move[i][0];
92         nextY = y + Move[i][1];
93         if (IsIn(nextX, nextY) && !isVis[nextX][nextY] && !g[nextX][nextY])
94             Dfs(nextX, nextY);
95     }
96 }

 

posted @ 2014-12-14 01:10  小白v  阅读(231)  评论(0编辑  收藏  举报