杭电 1045题 Fire Net

题目链接~~>

简单深度搜索,第一次做一次AC,第二次换了一种方法就找不出错误了!

search(x,y+1,t+1); s[x][y+1]='.';后面应该还有一个search(x,y+1,t);的调用;

代码(1):

#include<stdio.h>
int n,max=0;
char s[5][5];
void dfs(int x,int y,int q)
{
    void search(int x,int y,int q);
    int i,j;
    int f=0;
    for(i=x+1;i<n;i++)
      if(s[i][y]=='X')break;
      else if(s[i][y]=='Q'){f=1;break;}
    for(j=y+1;j<n;j++)
      if(s[x][j]=='X')break;
      else if(s[x][j]=='Q'){f=1;break;}
    for(i=x-1;i>=0;i--)
      if(s[i][y]=='X')break;
      else if(s[i][y]=='Q'){f=1;break;}
      for(j=y-1;j>=0;j--)
        if(s[x][j]=='X')break;
        else if(s[x][j]=='Q'){f=1;break;}
    if(f==0){s[x][y]='Q';q++;f=0;}
    if(q>max)max=q;
    search(x,y,q);
    s[x][y]='.';
}
void search(int x,int y,int q)
{
    int i,j;
    if(y==n-1){x=x+1;y=-1;}
    for(i=x;i<n;i++)
     {    if(i!=x)y=-1;
         for(j=y+1;j<n;j++)
       if(s[i][j]=='.')
       {
           dfs(i,j,q);
       }
     }
}
int main()
{
    int i,j;
    while(scanf("%d",&n)!=EOF)
    {
        max=0;
        if(n==0)break;
        for(i=0;i<n;i++)
          scanf("%s",s[i]);
         for(i=0;i<n;i++)
           for(j=0;j<n;j++)
             if(s[i][j]=='.')
               {
                   dfs(i,j,0);
               }
           printf("%d\n",max);
    }
    return 0;
}


 

代码(2):

#include<stdio.h>
char s[5][5];
int max,n;
void search(int x,int y,int t)
{
    int i,flag=0;
     if(t>max)
        max=t;
    if(y==n)
       {x++;y=0;}
      if(x==n)
        return ;
    if(s[x][y]=='X')flag=1;
    for(i=x+1;i<n;i++)
       if(s[i][y]=='A')
        {
             flag=1;
             break;
        }
    else if(s[i][y]=='X')
               break;
    for(i=x-1;i>=0;i--)
      if(s[i][y]=='A')
        {
            flag=1;
            break;
        }
      else if(s[i][y]=='X')
           break;
   for(i=y-1;i>=0;i--)
     if(s[x][i]=='A')
       {
           flag=1;
           break;
       }
     else if(s[x][i]=='X')
           break;
    for(i=y+1;i<n;i++)
      if(s[x][i]=='A')
        {
            flag=1;
            break;
        }
    else if(s[x][i]=='X')
           break;

    if(flag==0)
      {
          s[x][y]='A';
        // printf("%d\n",t+1);
       search(x,y+1,t+1);
         s[x][y]='.';
         search(x,y+1,t);
      }
   else
       search(x,y+1,t);
}
int main()
{
    int i,j;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)break;
          max=0;
        for(i=0;i<n;i++)
         scanf("%s",s[i]);
         for(i=0;i<n;i++)
           for(j=0;j<n;j++)
             if(s[i][j]=='.')
               {
                  search(i,j,0);
               }

        printf("%d\n",max);
    }
    return 0;
}


 

优代码链接~>

你可能感兴趣的:(杭电 1045题 Fire Net)