题意:给定一个由斜线组成的迷宫,让你求闭合的(成环的格子)有多少个,以及最长环状格子的长度
解题思路: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 ; }
小结,其中提到了一种算法叫做FloodFill算法,个人觉得在FloodFill里面求sum那里很有用,以后有机会要多用!
开始本来一直想用四分求解,但是一直不能判断它那些能走,那些不能走的情况!原来是不能不能同时跨越这个四分格子的x与y,也不能停留在里面!