HDOJ 1010 迷宮問題(DFS模版)

有一種隱約的興奮 , 感覺這種題目比較有意思 也比較難 搞懂會很有成就感的

主要是學會一種新的解決一類為題的方法 面對一種問題的思路

我想這種收穫遠遠比把一道題目解決更讓人高興

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h> 

 

int state[10][10],time,a,b,rx,ry,ax,ay;
char map[10][10];                                          //存放每一個位置的狀態
int num[4][2]={{0,1},{0,-1},{1,0},{-1,0}},flag;  //四格搜索:向四個方向上下左右搜索;送給聖誕夜的北極光八格搜索:http://www.cppblog.com/xiongnanbin/articles/94697.html?opt=admin
 
//const int dx[12]={1,-1,0,0,2,-2,0,0,1,-1,1,-1};
//const int dy[12]={0,0,1,-1,0,0,2,-2,-1,1,1,-1};

void DFS(int x,int y,int step)
{
     int i,kx,ky;
     if(x==ax && y==ay)     
     {
           if(step==time)
           flag=1;
           return;         
     }
     if(step==time)return;                                                           //剛好到達返回結果
     if(map[x][y]=='X')return;                                                      //到達目標返回結果
     if(flag)return;                                                                       //已經找過返回结果
     for(i=0;i<4;i++)
     {
           kx=x+num[i][0];
           ky=y+num[i][1];
           if(kx<0 || kx>=a || ky<0 || ky>=b)continue;                    //找下一步的條件
           if(state[kx][ky]==0)                                                        //防止出現循環   一個點只走一次
           {
                 state[kx][ky]=1;
                 DFS(kx,ky,step+1);                                                 //遞歸繼續下一步
                 state[kx][ky]=0;
                 if(flag)return;                    
           }                
     }
}
 
int main()
{
    int i,j;
    while(scanf("%d%d%d" , &a,&b,&time),a||b||time)
    {
           memset(state , 0 , sizeof (state));
           for(i=0;i<a;i++)
           {
                 getchar();                                                                 //注意吃字符     吃回車
                 for(j=0;j<b;j++)
                 {
                       scanf("%c" , &map[i][j]);
                       if(map[i][j]=='S'){rx=i , ry=j;}
                       if(map[i][j]=='D'){ax=i , ay=j;}                
                 }                
           }                     
           getchar();
           if(abs(rx-ax)+abs(ry-ay)>time || (rx+ay+ax+ry+time)%2==1)        //兩個優化:時間和步數關係  第二個優化還沒有看懂

                                                                                                                 //abs求絕對值 在stdlib.h中 不是在math.h中---------迷茫了

                                                                                                                 //(baidu上說,好像又是在math.h),還有fabs cabs喲

                                                                                                                 // 反正以後在寫程序的時候加上stdlib.h這個頭文件                            
                 {
                       printf("NO\n");
                       continue ;                        
                 }
           flag=0;                                                                                        //標記是否找到目標
           state[rx][ry]=1;                                                                            //標記是否已經找過路徑
           DFS(rx,ry,0);
           state[rx][ry]=0; 
           if(flag)
                 printf("YES\n");
           else
                 printf("NO\n");
    }
    return 0;    
}


你可能感兴趣的:(HDOJ 1010 迷宮問題(DFS模版))