7-11 Saving James Bond - Hard Version

題目

題意:50*50的池塘裏有n條鱷魚,中心有直徑爲15的圓臺,jams要踩着鱷魚的頭部連跳到池塘岸上,jams最大跨步爲m,要求輸出jams最小跳的步數,以及路徑(被踩的鱷魚座標)

tip:sort+dfs+路徑記錄

#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
struct position {
	int x,y;
};
struct position f[103];
int checked[103]= {0};
int n,m;
bool judge(int x,int y) {
	if(abs(x)+m>=50||abs(y)+m>=50)//判斷是否可一步到邊界 
		return true;
	return false;
}
vector<int> ans,temp;
int minjump=1e7;
void dfs(int x,int y,int s,int jump) {
	if(s!=-1) {//排除原點 
		temp.push_back(s);
		checked[s]=1;
	}
	if(jump>=minjump)//剪枝,如果跳的步數比最小的還大則無需繼續遍歷 
		return;
	if(judge(x,y)) {
		if(jump<minjump) {//更新最小路徑和最小跳數 
			ans=temp;
			minjump=jump;
		}
		return ;
	}
	for(int i=0; i<n; ++i)
		if(x==0&&y==0) {
			if(!checked[i]&&sqrt((pow(f[i].x,2)+pow(f[i].y,2)))-7.5<=m) {//找到第一個可跳的鱷魚 
				dfs(f[i].x,f[i].y,i,jump+1);
				checked[i]=0;
				temp.pop_back();
			}
		} else if(!checked[i]&&(pow(f[s].x-f[i].x,2)+pow(f[s].y-f[i].y,2))<=m*m) {//找到下一個可跳的鱷魚 
			dfs(f[i].x,f[i].y,i,jump+1);
			checked[i]=0;
			temp.pop_back();
		}
}
bool cmp(struct position a,struct position b) {
	return a.x*a.x+a.y*a.y<b.x*b.x+b.y*b.y;//按照與中心的距離排序 
}
int main() {
	cin>>n>>m;
	for(int i=0; i<n; ++i)
		cin>>f[i].x>>f[i].y;
	if(m>=42.5) {//一步能跳到 
		cout<<"1\n";
		return 0;
	}
	sort(f,f+n,cmp);
	dfs(0,0,-1,0);
	if(minjump!=1e7) {
		cout<<minjump+1<<endl;
		for(int i=0; i<ans.size(); ++i)
			cout<<f[ans[i]].x<<" "<<f[ans[i]].y<<endl;
	} else cout<<"0\n";
	return 0;
}

 

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