zoukankan      html  css  js  c++  java
  • Uva 705

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

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

    解题报告链接: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:
    ", No++);
    47         if(cycleNum != 0)
    48             printf("%d Cycles; the longest has length %d.
    ", cycleNum, Max / 3);
    49         else
    50             printf("There are no cycles.
    ");
    51         printf("
    ");
    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 }
    Donghua University
  • 相关阅读:
    bzoj 1176 cdq分治套树状数组
    Codeforces 669E cdq分治
    Codeforces 1101D 点分治
    Codeforces 1100E 拓扑排序
    Codeforces 1188D Make Equal DP
    Codeforces 1188A 构造
    Codeforces 1188B 式子转化
    Codeforces 1188C DP 鸽巢原理
    Codeforces 1179D 树形DP 斜率优化
    git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题
  • 原文地址:https://www.cnblogs.com/ohxiaobai/p/4156262.html
Copyright © 2011-2022 走看看