zoukankan      html  css  js  c++  java
  • 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,也不能停留在里面!

    没有梦想,何谈远方
  • 相关阅读:
    【SpringFramework】Spring 事务控制
    Mini 学生管理器
    方法的重写override,重载overload。
    方法封装,属性调用以及设置。
    判断hdfs文件是否存在
    模拟(删除/远程拷贝)当前一周的日志文件
    2.上传hdfs系统:将logs目录下的日志文件每隔十分钟上传一次 要求:上传后的文件名修为:2017111513xx.log_copy
    使用定时器:在logs目录,每两分钟产生一个文件
    五个节点的hadoop集群--主要配置文件
    hadoop集群配置文件与功能对应解析
  • 原文地址:https://www.cnblogs.com/zyue/p/3112746.html
Copyright © 2011-2022 走看看