zoj 1002 Fire Net dfs

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

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

                  3

                  ...

                  ..X

                  .XX

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

递归递归我爱你!!!

#include
#include
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


 

你可能感兴趣的:(zoj,搜索)