题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4414
解题思路:
题目大意:
给你一个 n*n 的图 (3 <= n <= 50),然后让你找出有多少个十字架,输出结果,十字架结构:由 "#" 构成,十字架周围不可以有 "#" 才满足条件。
比如说这个图:有一个十字架,那么红色区域都不能够是 "#", 否则这个十字架不算数。。。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
char maze[55][55];
bool check(int x,int y){
int up = 0,down = 0,left = 0,right = 0;
//up
for(int i = x-1; i >= 0; i--){
if(maze[i][y] != '#')
break;
else if(maze[i][y-1] == '#' || maze[i][y+1] == '#')
return false;
else
up++;
}
if(up == 0)
return false;
//down
for(int i = x+1; i < n; i++){
if(maze[i][y] != '#')
break;
else if(maze[i][y-1] == '#' || maze[i][y+1] == '#')
return false;
else
down++;
}
if(down == 0)
return false;
if(up != down)//上下比较
return false;
//left
for(int i = y-1; i >= 0; i--){
if(maze[x][i] != '#')
break;
else if(maze[x-1][i] == '#' || maze[x+1][i] == '#')
return false;
else
left++;
}
if(left == 0)
return false;
//right
for(int i = y+1; i < n; i++){
if(maze[x][i] != '#')
break;
else if(maze[x-1][i] == '#' || maze[x+1][i] == '#')
return false;
else
right++;
}
if(right == 0)
return false;
if(left != right)//左右比较
return false;
if(up != left)//上左比较
return false;
return true;
}
int main(){
while(scanf("%d",&n),n){
for(int i = 0; i < n; i++){
scanf("%s",maze[i]);
}
int ans = 0;
for(int i = 1; i < n-1; i++){
for(int j = 1; j < n-1; j++){
if(maze[i][j] == '#' && check(i,j))
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}