hdu 4414 Finding crosses
2012-10-05 16:12
232 查看
/*找十字架。。 我们首先找出所有可能的中点(上下左右各有一个点)。 然后一个个中点bfs。。 */ #include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; char map[52][52]; int n,sum; int fx[4][2]={0,-1,0,1,-1,0,1,0}; void init() { sum=0; } struct node { int x; int y; }; bool iscenter(int x,int y) { if(x+1<n&&map[x+1][y]=='#'&&x-1>=0&&map[x-1][y]=='#'&&y-1>=0&&map[x][y-1]=='#'&&y+1<n&&map[x][y+1]=='#') { return true; } return false; } bool isvalide(int x,int y) { if(x<0||x>=n||y<0||y>=n||map[x][y]=='o') return false; return true; } void bfs(int x,int y) { queue<node> qu; node t1,t2; int cx=x;int cy=y; int sumsp=0,sumshuz=0,sumsp2=0,sumshuz2=0; int flag=0; int tx,ty; t1.x=x; t1.y=y; map[x][y]='o'; qu.push(t1); while(!qu.empty()) { t2=qu.front(); qu.pop(); for(int i=0;i<4;i++) { tx=t2.x+fx[i][0]; ty=t2.y+fx[i][1]; if(isvalide(tx,ty)) { if(!flag) { if(fx[i][0]) { if(fx[i][0]>0) sumshuz++; else sumshuz2++; if(ty!=cy) { flag=1; } } else { if(fx[i][1]>0) sumsp++; else sumsp2++; if(tx!=cx) { flag=1; } } } map[tx][ty]='o'; t1.x=tx; t1.y=ty; qu.push(t1); } } } if(!flag&&sumshuz==sumsp&&sumshuz==sumshuz2&&sumshuz==sumsp2) { sum++; } } int main() { while(scanf("%d",&n)&&n!=0) { for(int i=0;i<n;i++) { scanf("%s",map[i]); } init(); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(map[i][j]=='#'&&iscenter(i,j)) { bfs(i,j); } } } printf("%d\n",sum); } }
相关文章推荐
- HDU 4414 Finding crosses(搜索)
- HDU 4414 Finding crosses(暴力判断)
- HDU 4414 Finding crosses 暴力枚举
- hdu 4414 Finding crosses(模拟)
- HDU 4414: Finding crosses
- hdu-4414-Finding crosses
- HDU 4414 Finding crosses (暴力模拟)
- hdu 4414 Finding crosses(搜索)
- HDU 4414 Finding crosses(dfs)
- hdu 4414 Finding crosses 简单搜索
- HDU 4414 Finding crosses
- HDU 4414 Finding crosses (DFS + BFS)
- HDU 4414 Finding crosses(爆搜)
- HDU 4414 Finding crosses(dfs)
- HDU-4414 Finding crosses 水题
- hdu 4414 Finding crosses
- HDU 4414 Finding crosses (DFS + BFS)
- hdu 4414 Finding crosses【简单模拟】
- hdu 4414 Finding crosses
- HDU 4414 Finding crosses