zoj 1002 Fire Net dfs

16 篇文章 0 订阅

  做完这道题,我发现自己越来越喜欢递归了。最初就是理解不了,现在却觉得用递归解决问题非常方便,哈哈!

最初这道题一会就把代码写好了,样例也过了,但就是WA。。。想了又想,还是没找出错误,最后搜了一下这道题的数据发现:

                  3

                  ...

                  ..X

                  .XX

这组数据过不去,我又仔细的画了一下递归过程,发现原来程序中k=0(k--那一步,原先是k=0)是错误的,因为在递归回溯的过程中,k值还可能被用到,故换成了k--,也就是在回溯一次a[i][j]=1的同时,让发现的可放数目k也回溯一次(减一),这样就顺利的把这道题AC了,呵呵!

递归递归我爱你!!!

#include<stdio.h>
#include<string.h>
int a[6][6],max,n,k;
void dfs()
{
    int i,j,p,num=0;
    int px[200],py[200];
    for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
       {
           if(a[i][j]==1)
           {
               k++;
               a[i][j]=-1;
               for(p=j+1;p<=n;p++)
               {
                 if(a[i][p]==0)
                   break;
                 else
                   if(a[i][p]==1) 
                   { 
                      a[i][p]=-1;
                      px[num]=i;
                      py[num]=p;
                      num++;
                    }
               }
               for(p=j-1;p>=1;p--)
               {
                  if(a[i][p]==0)
                    break;
                  else
                    if(a[i][p]==1)
                    {  
                       a[i][p]=-1;
                       px[num]=i;
                       py[num]=p;
                       num++;
                    }
               }
               
               for(p=i+1;p<=n;p++)
               {
                  if(a[p][j]==0)
                     break;
                  else
                    if(a[p][j]==1)
                    {
                       a[p][j]=-1;
                       px[num]=p;
                       py[num]=j;
                       num++;
                    }
               }
               for(p=i-1;p>=1;p--)
               {
                   if(a[p][j]==0)
                    break;
                  else
                    if(a[p][j]==1)
                    {  
                       a[p][j]=-1;
                       px[num]=p;
                       py[num]=j;
                       num++;
                    }
               }        
               dfs();
               while(num)
               {
                    num--;
                    a[px[num]][py[num]]=1;
               }
               if(k>max)
                  max=k;
               
               a[i][j]=1;
               k--;  //原先错误的做法是 k=0; 
         } 
     }
}
                
int main()
{
    int i,j;
    char s[6];
    while(scanf("%d",&n)&&n)
    {
        getchar();
        max=k=0;
        memset(a,0,sizeof(a));// 0 stand wall
        for(i=0;i<n;i++)
        {
            gets(s);
            for(j=0;j<n;j++)
              if(s[j]=='.')
                 a[i+1][j+1]=1;   
        }
        dfs();
        printf("%d\n",max);    
    }
    return 0;
}
        


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值