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