题目链接: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