1010 Tempter of the Bone dfs

題目 http://acm.hdu.edu.cn/showproblem.php?pid=1010

剛開始拿着這個題目  開始用bfs   但是一提交就錯  不知道爲什麼  很糾結哦  

但是最後還是看別人解題報告才知道哦   

題意   是給一個起點 S    總點D  求S 到 D點的距離哦  但是時間要切好等於 t 時,

奇偶剪枝:
是數據結構的搜索中,剪枝的一種特殊小技巧。
現假設起點爲(sx,sy),終點爲(ex,ey),給定t步恰好走到終點,
 
s        
|        
|        
|        
+ e
如圖所示(“|”豎走,“—”橫走,“+”轉彎),易證abs(ex-sx)+abs(ey-sy)爲此問題類中任意情況下,起點到終點的最短步數,記做step,此處step1=8;
  
s  
  +  
| +      
|        
+ e
如圖,爲一般情況下非最短路徑的任意走法舉例,step2=14;
step2-step1=6,偏移路徑爲6,偶數(易證);
故,若t-[abs(ex-sx)+abs(ey-sy)]結果爲非偶數(奇數),則無法在t步恰好到達;
返回,false;
反之亦反。
下面給出ac代碼哦
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

char a[7][7];
int dre[4][2]={0,1,1,0,0,-1,-1,0};
int n,m,t,sx,sy,ex,ey,flag;

void dfs(int x,int y,int time)
{
    if(flag==1) return ;
    ///t-[abs(ex-sx)+abs(ey-sy)]結果爲非偶數(奇數),則無法在t步恰好到達
    if(time<abs(ex-x)+abs(ey-y)||(time-(abs(ex-x)+abs(ey-y)))%2) return ;

    if(time==0)  ///t代表剩餘時間,每走一步t--,這裏若t=0,則迷宮坍塌
    {
        if(ex==x&&ey==y){ flag=1; return ;}
        else return ;
    }
    else for(int i=0;i<4;i++)  ///上右下左查詢
    {
        int nx=x+dre[i][0];
        int ny=y+dre[i][1];
        if(nx>=0&&nx<n&&ny>=0&&ny<=m&&(a[nx][ny]=='.'||a[nx][ny]=='D'))
        {
            a[nx][ny]='X';
            dfs(nx,ny,time-1);  ///搜索
            a[nx][ny]='.'; ///回溯
        }
    }
    return ;
}

int main()
{
    int i,j;
    while(cin>>n>>m>>t,n+m+t)
    {
        int count=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                cin>>a[i][j];
                if(a[i][j]=='S'){sx=i,sy=j;}
                else if(a[i][j]=='D'){ex=i,ey=j;}
                else if(a[i][j]=='.') count++;  ///記錄如果全走多少步
            }
        }
        if(count+1<t)  ///總共可以走的步數如果比給定時間還少
        {
            cout<<"NO"<<endl;
            continue;
        }
        flag=0;
        dfs(sx,sy,t);
        if(flag){cout<<"YES"<<endl; continue;}
        else {cout<<"NO"<<endl; continue;}
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章