HDOJ 4414 Finding crosses 搜索

来源:互联网 发布:西南财大网络教育图片 编辑:程序博客网 时间:2024/05/22 03:27
//HDOJ 4414 Finding crosses 搜索/*题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4414题意:问一副图中的十字架个数有几个  十字架的定义是由'#'组成并且十字架的size大于等于3且不能有'#'出现在其相邻的位置(水平、竖直)  具体请看题目思路:枚举中点位置,然后找其四个方向能延伸出去多少个'#',时间复杂度O(n^3)*/#include<stdio.h>#include<string.h>#include<stdlib.h>#define INF 100000000#define N 55int n;char map[N][N];bool check(int x,int y){if(x >= 0 && x < n && y >=0 && y < n)return true;return false;}int Min(int x,int y){return x<y?x:y;}bool bx(int x,int y){int i,j,xx,yy;int a = 1, b = 1, c = 1, d = 1;bool aa = false,bb = false,cc=false,dd=false;for(i = 1; a == i; ++i){yy = y - i;if(check(x,yy) && map[x][yy]=='#')if(!check(x+1,yy) || (check(x+1,yy)&&map[x+1][yy]!='#'))if(!check(x-1,yy) || (check(x-1,yy)&&map[x-1][yy]!='#'))++a;aa=true;}for(i = 1; b == i ; ++i){yy = y + i;if(check(x,yy) && map[x][yy]=='#')if(!check(x+1,yy) || (check(x+1,yy)&&map[x+1][yy]!='#'))if(!check(x-1,yy) || (check(x-1,yy)&&map[x-1][yy]!='#'))++b,bb=true;}for(i = 1; c == i; ++i){xx = x - i;if(check(xx,y) && map[xx][y]=='#')if(!check(xx,y+1) || (check(xx,y+1)&&map[xx][y+1]!='#'))if(!check(xx,y-1) || (check(xx,y-1)&&map[xx][y-1]!='#'))++c,cc=true;}for(i = 1; d == i; ++i){xx = x + i;if(check(xx,y) && map[xx][y]=='#')if(!check(xx,y+1) || (check(xx,y+1)&&map[xx][y+1]!='#'))if(!check(xx,y-1) || (check(xx,y-1)&&map[xx][y-1]!='#'))++d,dd=true;}return a==b && b==c && c==d && aa && bb && cc && dd;}int cal(){int i,j,ans = 0;for(i = 0; i < n; ++i){for(j = 0; j < n; ++j)if(map[i][j] == '#' && bx(i,j))++ans;}return ans;}int main(){int i;while(scanf("%d",&n),n){for(i = 0; i < n; ++i)scanf("%s",map[i]);printf("%d\n",cal());}return 0;}

原创粉丝点击