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
  • 相关阅读:
    oc 谓词
    NSFileHandle、NSFileMange
    writetofile 与 NSFileHandle
    IOS SQLite数据库
    在iPhone项目中使用讯飞语音SDK实现语音识别和语音合成
    iOS编程规范
    CocoaPods
    ASIHTTPRequest类库简介和使用说明---数据库做缓存
    FMDB使用(转载)
    UITextField使用
  • 原文地址:https://www.cnblogs.com/ohxiaobai/p/4156262.html
Copyright © 2011-2022 走看看