题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4414

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
比较恶心的模拟题!
代码如下:(模拟)
#include <cstdio>
#include <cstring>
const int MAXN = 57;
int main()
{
char map[MAXN][MAXN];
int n;
int i, j, k;
int sum;
while(scanf("%d",&n) && n)
{
sum = 0;//总个数
memset(map,0,sizeof(map));
for(i = 1; i <= n; i++)
{
scanf("%s",map[i]);
}
int cont = 0;
int t;//每一个段落的数量
int tt = 0;//记录连续的#的中间位置
int up = 0, down = 0;//记录上下段是否符合
int pos = 0;//记录连续的#开始的地方
for(i = 2; i <= n; i++)//直接从第二行开始找
{
cont = up = down = 0;
for(j = 0; j < n; j++)
{
up = down = 0;
if(map[i][j]=='#')//寻找连续#的个数
cont++;
if(cont == 1)
pos = j;
if(j == n-1 || map[i][j] != '#')
{
if(cont % 2 == 0)
{
cont= 0;
continue;//连续的为偶数个,不符合
}
else
{
if(cont == 1)//只有一个不能组成十字架
{
cont = 0;
continue;
}
tt = pos + cont/2;//中间位置
t = cont/2;//每一个段落的数量
int c1 = 0, c2 = 0;
for(k = i-1; ; k--)//从中间向上寻找连续的#
{
if(map[k][tt]=='#' && map[k][tt-1]!='#' && map[k][tt+1]!='#')
{
c1++;
if(c1 == t && map[k-1][tt]!='#')
{
up = 1;
break;
}
}
else
break;
}
for(k = i+1; ; k++)//从中间向下寻找连续的#
{
if(map[k][tt]=='#' && map[k][tt-1]!='#' && map[k][tt+1]!='#')
{
c2++;
if(c2 == t && map[k+1][tt]!='#')
{
down = 1;
break;
}
}
else
break;
}
int flag = 0;
for(k = pos; k < tt; k++)//寻找左段是否符合
{
if(map[i-1][k]=='#' || map[i+1][k]=='#')
flag = 1;
}
for(k = tt+1; k <= tt+t; k++)//寻找右段是否符合
{
if(map[i-1][k]=='#' || map[i+1][k]=='#')
flag = 1;
}
if(up == 1 && down == 1 && flag == 0)
sum+=1;
}
cont = 0;
}
}
}
printf("%d\n",sum);
}
return 0;
}
/*
7
0#000#0
###0###
0#000#0
0000000
00#0000
0###000
00#0000
7
o#ooo#o
###o###
o#o#o#o
ooo#ooo
o#####o
ooo#o#o
ooo#ooo
11
ooooo#ooooo
oo#oo#oo#oo
o###o#o###o
oo#oo#oo#oo
ooooo#ooooo
###########
ooooo#ooooo
oo#oo#oo#oo
o###o#o###o
oo#oo#oo#oo
ooooo#ooooo
*/
再贴一段别人的DFS代码:
#include<iostream>
#include<stdio.h>
using namespace std;
char matrix[55][55];
int n;
bool dfs(int x,int y)
{
if(matrix[x][y]=='o')
return false;
int len1=0,len2=0,len3=0,len4=0;
bool flag=false;
for(int i=x-1; i>=0; i--)
{
if(matrix[i][y]=='#')
{
len1++;
if(matrix[i][y-1]=='#'||matrix[i][y+1]=='#')
{
flag=true;
}
}
else
break;
}
if(len1<1||flag)
return false;
flag=false;
for(int i=x+1; i<n; i++)
{
if(matrix[i][y]=='#')
{
len2++;
if(matrix[i][y-1]=='#'||matrix[i][y+1]=='#')
flag=true;
}
else
break;
}
if(len2!=len1||flag)
return false;
flag=false;
for(int j=y-1; j>=0; j--)
{
if(matrix[x][j]=='#')
{
len3++;
if(matrix[x-1][j]=='#'||matrix[x+1][j]=='#')
flag=true;
}
else
break;
}
if(len3!=len1||flag)
return false;
flag=false;
for(int j=y+1; j<n; j++)
{
if(matrix[x][j]=='#')
{
len4++;
if(matrix[x-1][j]=='#'||matrix[x+1][j]=='#')
flag=true;
}
else break;
}
if(len4!=len1||flag)
return false;
return true;
}
int main()
{
while(scanf("%d",&n),n)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cin>>matrix[i][j];
}
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(dfs(i,j))
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
HDU4414 Finding crosses(模拟 || DFS),布布扣,bubuko.com
HDU4414 Finding crosses(模拟 || DFS)
原文地址:http://blog.csdn.net/u012860063/article/details/38490793