分析:一个图,求图中‘#’组成了多少个十字架,注意十字架的宽度是奇数。对每个‘#’判断,上下左右 ,步长为1 ,2,。。。25是不是都符合条件,符合的话判断个数为奇数即可。
#include<iostream> using namespace std; #define N 50 char map[N][N]; int dir[4][2]={ {-1,0}, {0,-1}, {1,0}, {0,1}}; int n,ans; bool valid(int x,int y) { return x>=0 && x<n && y>=0 && y<n; } bool judge(int x,int y) { int cnt=0,tmpc,i,j,x2,y2; for(i=1;i<=25;i++) //枚举步长 { tmpc=0; for(j=0;j<4;j++) //四个方向 { x2=x+dir[j][0]*i; y2=y+dir[j][1]*i; if(valid(x2,y2) && map[x2][y2]=='#') { tmpc++; if(j%2==0) //左右 { if(y2>0&&map[x2][y2-1]=='#' || y2<n-1 && map[x2][y2+1]=='#') //是否存在相邻的 return false; } else //上下 { if(x2>0&&map[x2-1][y2]=='#' || x2<n-1 && map[x2+1][y2]=='#') //是否存在相邻的 return false; } cnt++; } } if(tmpc==0) break; //一个都没有 if(tmpc!=4) return false; } if(cnt%2==0 && cnt>0) return true; else return false; } int solve() { int i,j; ans=0; for(i=0;i<n;i++) for(j=0;j<n;j++) if(map[i][j]=='#' && judge(i,j)) ans++; return ans; } int main() { int i,j; while(cin>>n && n) { getchar(); for(i=0;i<n;i++) for(j=0;j<n;j++) cin>>map[i][j]; cout<<solve()<<endl; } return 0; }
时间: 2024-10-09 23:57:31