您的位置:首页 > 其它

HDU 4414 Finding crosses(爆搜)

2017-04-23 20:00 351 查看

思路:

枚举十字路口中心的位置。判断上下左右是否分别满足条件。

#include <iostream>
#include <cstdio>
#include <string.h>
#include <cmath>
#include <map>
#define eps 1e-9
typedef long long int lli;
using namespace std;

int ma[60][60];
char s[200];
int ans;
int flag = 0;
int dir[4][2] =  {
-1,0, 1,0, 0,-1, 0,1
};
int cnt[4];
int check(int ii,int jj,int d1,int d2,int cnt){
if(ma[ii][jj] != 1) return cnt-1;
if(ma[ii+d2][jj+d1] == 1 || ma[ii-d2][jj-d1] == 1){
flag = 0;
return 0;
}
return check(ii+d1,jj+d2,d1,d2,cnt+1);
}
void che(int ii,int jj){
flag = 1;
for(int i = 0;i < 4;i++){
cnt[i] = check(ii+dir[i][0],jj+dir[i][1],dir[i][0],dir[i][1],1);
}
if(cnt[0] != cnt[1] || cnt[2] != cnt[3]) flag = 0;
if(flag == 1 && cnt[0] != 0 && cnt[2] != 0) ans++;
}
int main(){
int n;
while(scanf("%d",&n),n){
ans = 0;
memset(ma,0,sizeof(ma));
for(int i = 1;i <= n;i++){
scanf("%s",s);
for(int j = 0;s[j];j++){
if(s[j] == '#'){
ma[i][j+1] = 1;
}
}
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if(ma[i][j] == 1){
che(i,j);
}
}
}
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: