HDU ACM 4414 Finding crosses 暴力枚举

来源:互联网 发布:东阿县南湖行知学校 编辑:程序博客网 时间:2024/06/12 01:24

分析:一个图,求图中‘#’组成了多少个十字架,注意十字架的宽度是奇数。对每个‘#’判断,上下左右 ,步长为1 ,2,。。。25是不是都符合条件,符合的话判断个数为奇数即可。

#include<iostream>using namespace std;#define N 50char 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;      }


0 0
原创粉丝点击