您的位置:首页 > 其它

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: