1. 程式人生 > >杭電acm 4414 Finding Crosses dfs的運用

杭電acm 4414 Finding Crosses dfs的運用

題目傳送

解題思路:本題大意是給你一張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;
}