• uva 705 Slash Maze 解题报告


    题意:给定一个由斜线组成的迷宫,让你求闭合的(成环的格子)有多少个,以及最长环状格子的长度

    解题思路:http://blog.csdn.net/ra_winding/article/details/7724290#comments

    解题代码:
    (我)

    // File Name: uva705.c
    // Author: darkdream
    // Created Time: 2013年05月24日 星期五 18时58分27秒
    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<time.h>
    #include<math.h>
    int map[1000][1000];
    char str[100][100];
    int sum,max;
    int xadd[] = {0,0,1,-1};
    int yadd[] = {1,-1,0,0};
    
    void change(int i , int j , char c)
    {
       for(int t = 3*i -2; t <= 3*i ;t++)
           for(int p = 3*j-2 ; p <= 3*j ; p++)
           {
             map[t][p] = 1;
           }
       if(c == '/')
       {
           map[3*i-2][3*j] = 0;
           map[3*i-1][3*j-1] = 0;
           map[3*i][3*j-2] =0 ;
        
       }
       else 
       {
          map[3*i-2][3*j-2] = 0;
          map[3*i-1][3*j-1] = 0;
          map[3*i][3*j] = 0 ;
       }
    }
    int FloodFill(int i , int j)
    {
       if(!map[i][j])
           return 0 ;
       map[i][j] = 0 ;
       int sum = 1;
       for(int t = 0 ;t < 4; t ++)
       {
         sum +=  FloodFill(i+xadd[t],j+yadd[t]);
       }
      return sum;
    }
    int main(){
    
       //freopen("/home/plac/problem/input.txt","r",stdin);
       //freopen("/home/plac/problem/output.txt","w",stdout);
        int n , m ,CASE = 0;
        while(scanf("%d %d",&m,&n) != EOF,n,m)
        {
           CASE ++;
           memset(map,0,sizeof(map));
           memset(str,0,sizeof(str)); 
           sum = 0;
           max = 0;
          for(int i = 1; i <= n;i ++)
          {
              scanf("%s",&str[i][1]);
              for(int j = 1; j <= m; j ++)
               change(i,j,str[i][j]);
          }
          for(int i = 1;i <= 3*n; i ++)
          { 
              FloodFill(i,1);
              FloodFill(i,3*m);
          }
          for(int i = 1;i <= 3*m; i ++)
          { 
              FloodFill(1,i);
              FloodFill(3*n,i);
          }
          for(int i = 1;i <= 3*n ;i ++)
              for(int j = 1;j <= 3*m ;j ++)
              {
                int temp = FloodFill(i,j)/3;
                if(temp >max)
                    max = temp;
                if(temp)
                    sum++;
              }
         printf("Maze #%d:\n",CASE);
         if(sum)
           printf("%d Cycles; the longest has length %d.\n\n",sum,max);
         else
             printf("There are no cycles.\n\n");
        }
    return 0 ;
    }
    View Code

    小结,其中提到了一种算法叫做FloodFill算法,个人觉得在FloodFill里面求sum那里很有用,以后有机会要多用!

    开始本来一直想用四分求解,但是一直不能判断它那些能走,那些不能走的情况!原来是不能不能同时跨越这个四分格子的x与y,也不能停留在里面!

    没有梦想,何谈远方
  • 相关阅读:
    Elementui:选择框
    Cesium之Cesium3DTileStyle
    Cesium粒子系统:雨雪云效果
    Cesium之3dtiles模型选择问题
    3dtiles贴地
    Android ListView异步加载图片
    Android的硬件加速
    Android ANR
    每天一点Linux 查看Ubuntu的版本号
    Android log system
  • 原文地址:https://www.cnblogs.com/zyue/p/3112746.html
Copyright © 2020-2023  润新知