hdu-1010 Tempter of the Bone 曼哈顿距离

曼哈顿距离,讲的是格子图上的两点之间的任何路径长度都比最短的那一条路多偶数个单位长度

这样理解有点浅显,具体原理、推广什么的参考百度吧

这题有点意思

代码参考了别人的才会写的,不然一直超时

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_35513792/article/details/84935258