zoj 1002 Fire Net dfs

2908 단어 zoj수색하다
이 문제를 다 풀고 나니, 나는 점점 돌아가는 것을 좋아하게 되었다.처음에는 이해가 안 됐는데, 지금은 역귀로 문제를 해결하는 것이 매우 편리하다고 느낀다. 하하!
처음에 이 문제는 잠시 후에 코드를 다 썼고 샘플도 지났지만 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

좋은 웹페이지 즐겨찾기