
4 oo#o o### oo#o ooo# 4 oo#o o### oo#o oo#o 5 oo#oo oo#oo ##### oo#oo oo##o 6 ooo#oo ooo##o o##### ooo#oo ooo#oo oooooo 0
1 0 0 0
题意:找出十字架个数
思路:列举十字架的中点,dfs时传进去方向,方便判断十字架周围是不是有#(这是不合格的)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
using namespace std;
#define N 55
int ans,le,ri,up,down,temp;
int n,flag;
int step[4][2]={-1,0,1,0,0,-1,0,1};//上,下,左,右
char a[N][N];
int judge(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<n)
return 1;
return 0;
}
void dfs(int x,int y,int i)
{
temp++;
int j;
if(i<2) j=2;
else
j=0;
int xx=x+step[i][0];
int yy=y+step[i][1];
if(!judge(xx,yy)) return ;
if(a[xx][yy]=='o') return ;
int xup=xx+step[j][0];
int ydn=yy+step[j][1];
if(judge(xup,ydn)&&a[xup][ydn]=='#')
{
flag=1;
return ;
}
xup=xx+step[j+1][0];
ydn=yy+step[j+1][1];
if(judge(xup,ydn)&&a[xup][ydn]=='#')
{
flag=1;
return ;
}
dfs(xx,yy,i);
}
int main()
{
int i,j;
while(scanf("%d",&n),n)
{
for(i=0;i<n;i++)
scanf("%s",a[i]);
ans=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i][j]=='#')
{
temp=0;
flag=0;
dfs(i,j,0);
up=temp;
temp=0;
if(flag) continue;
dfs(i,j,1);
down=temp;
temp=0;
if(flag) continue;
dfs(i,j,2);
le=temp;
temp=0;
if(flag) continue;
dfs(i,j,3);
ri=temp;
temp=0;
if(flag) continue;
if(le==ri&&down==up&&le!=1&&up!=1) //左右相等,上下相等,不能是一条线
ans++;
}
printf("%d\n",ans);
}
return 0;
}
原文:http://blog.csdn.net/u014737310/article/details/39693023