杭電acm 4414 Finding Crosses dfs的運用
阿新 • • 發佈:2019-01-02
解題思路:本題大意是給你一張n*n的圖,圖中有由'#'組成的十字架,現在讓你算算該圖中共有多少個十字架,十字架是有限制的,首先,需要‘#’個數是技術,且四個方向的‘#’相同,其次兩邊不能有‘#’,故只能沿四個方向深搜。
圖中紅筆區域不能有‘#’。
程式碼1:四個方向遍歷
#include <iostream> #include <cstdio> using namespace std; char maze[55][55]; int n; bool solve(int x,int y) { int up=0,down=0,left=0,right=0; 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; 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; 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; 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(left != down) return false; return true; } int main() { while(scanf("%d",&n)!=EOF && n) { int ans = 0; for(int i=0;i<n;i++) scanf("%s",maze[i]); for(int i=1;i<n;i++) for(int j=1;j<n;j++) if(maze[i][j] == '#' && solve(i,j)) { ans++; } printf("%d\n",ans); } return 0; }
程式碼2:dfs深搜
#include <iostream> #include <cstdio> using namespace std; char maze[55][55]; int n; int dir[4][4] = {{1,0},{0,1},{-1,0},{0,-1}}; bool dfs(int x,int y) { int cnt = 0,step,dx,dy; for(int i=1;i<=25;i++) { step = 0; for(int j=0;j<4;j++) { dx = x + dir[j][0]*i; dy = y + dir[j][1]*i; if(dx>=0 && dx<n && dy>=0 && dy<n && maze[dx][dy] == '#') { step++; if(j % 2 == 0)//上下 { if((dy > 0 && maze[dx][dy-1] == '#') || (dy < n-1 && maze[dx][dy+1] == '#')) return false; } else//左右 { if((dx > 0 && maze[dx-1][dy] == '#') || (dx < n-1 && maze[dx+1][dy] == '#')) return false; } cnt++; } } if(step == 0) break; if(step != 4) return false; } if(cnt % 2==0 && cnt>0) return true; else return false; } int main() { while (scanf("%d",&n)!=EOF && n) { for(int i=0;i<n;i++) scanf("%s",maze[i]); int ans = 0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) if(maze[i][j] == '#' && dfs(i,j)) ans++; } printf("%d\n",ans); } return 0; }