hdu-1010 Tempter of the Bone 曼哈頓距離
阿新 • • 發佈:2018-12-10
曼哈頓距離,講的是格子圖上的兩點之間的任何路徑長度都比最短的那一條路多偶數個單位長度
這樣理解有點淺顯,具體原理、推廣什麼的參考百度吧
程式碼參考了別人的才會寫的,不然一直超時
#include <iostream> #include <queue> #include <cmath> using namespace std; int N,M,T; int dx[]={0,1,0,-1},dy[]={1,0,-1,0}; char a[8][8]; int canArrive; bool flag=false; int si=0,sj=0,di=0,dj=0; bool isValid(int x,int y){ if(x>=0&&x<N&&y>=0&&y<M&&a[x][y]!='X'){ if(a[x][y]=='D') canArrive=1; return true; } else return false; } void DFS(int x,int y,int len){ if(x==di&&y==dj&&len==T){ flag=true; return ; } if(flag){ return ; } int t=T-len-abs(x-di)-abs(y-dj);//奇偶剪枝-曼哈頓距離 關鍵 if(t<0||t&1){ return ; } for(int i=0;i<4;i++){ int xx=x+dx[i],yy=y+dy[i]; if(isValid(xx,yy)){ a[xx][yy]='X'; DFS(xx,yy,len+1); a[xx][yy]='.'; } } return ; } int main(){ while(cin>>N>>M>>T){ flag=false;int w=0; if(N==0&&M==0) break; for(int i=0;i<N;i++){ for(int j=0;j<M;j++){ cin>>a[i][j]; if(a[i][j]=='S') { si=i;sj=j; } if(a[i][j]=='D'){ di=i;dj=j; } if(a[i][j]=='X'){ w++; } } } if(M*N<=T+w){ cout<<"NO"<<endl; continue; } a[si][sj]='X'; if((int)abs(abs(si-di)+abs(sj-dj)-T)%2==0){ DFS(si,sj,0); }//曼哈頓距離 if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }