題目 http://acm.hdu.edu.cn/showproblem.php?pid=1010
剛開始拿着這個題目 開始用bfs 但是一提交就錯 不知道爲什麼 很糾結哦
但是最後還是看別人解題報告才知道哦
題意 是給一個起點 S 總點D 求S 到 D點的距離哦 但是時間要切好等於 t 時,
s | ||||
| | ||||
| | ||||
| | ||||
+ | — | — | — | e |
s | — | — | — | |
— | — | + | ||
| | + | |||
| | ||||
+ | — | — | — | e |
#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;
}