P1433 吃奶酪 回溯法 优化
生活随笔
收集整理的這篇文章主要介紹了
P1433 吃奶酪 回溯法 优化
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
房間里放著n塊奶酪。一只小老鼠要把它們都吃掉,問至少要跑多少距離?老鼠一開始在(0,0)點(diǎn)處。
輸入輸出格式
輸入格式:
?
第一行一個(gè)數(shù)n (n<=15)
接下來每行2個(gè)實(shí)數(shù),表示第i塊奶酪的坐標(biāo)。
兩點(diǎn)之間的距離公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
?
輸出格式:
?
一個(gè)數(shù),表示要跑的最少距離,保留2位小數(shù)。
?
輸入輸出樣例
輸入樣例#1:?復(fù)制 4 1 1 1 -1 -1 1 -1 -1 輸出樣例#1:?復(fù)制 7.41一開始回溯法顯然超時(shí)
然后加了一個(gè)剪枝勉強(qiáng)能過
不過花了800+ms #include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define inf 0x3f3f3f3f #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) // #define N int n; struct node {double x,y; }s[20]; int vis[20]; double dd(node a,node b ) {return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) ); } double mind=inf;void dfs(int cur,int cnt,double d) {if(cnt==n){mind=min(mind,d);return ;}if(d>=mind)return ;//關(guān)鍵剪枝rep(i,1,n){if(vis[i])continue;vis[i]=1;dfs(i,cnt+1,d+dd( s[cur],s[i] ));vis[i]=0;}return ; } int main() {RI(n);rep(i,1,n)cin>>s[i].x>>s[i].y;rep(i,1,n)vis[i]=1,dfs(i,1,sqrt(s[i].x*s[i].x+s[i].y*s[i].y) ),vis[i]=0;printf("%.2lf",mind);return 0; } View Code
?
按照曼哈頓距離排序的話剪了30ms。。。
n<=15的回溯法就接近爆時(shí)間
加上一個(gè)剪枝可以進(jìn)行一定程度的優(yōu)化
預(yù)處理兩點(diǎn)距離即可
580ms #include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define inf 0x3f3f3f3f #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) // #define N int n; struct node {double x,y; }s[20]; int vis[20]; double dd(node a,node b ) {return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) ); } double mind=inf;double dis[20][20];void dfs(int cur,int cnt,double d) {if(cnt==n){mind=min(mind,d);return ;}if(d>=mind)return ;//關(guān)鍵剪枝rep(i,1,n){if(vis[i])continue;vis[i]=1;dfs(i,cnt+1,d+dis[cur][i]);vis[i]=0;}return ; } int main() {RI(n);rep(i,1,n)cin>>s[i].x>>s[i].y;rep(i,1,n)rep(j,1,n)dis[i][j]=dd(s[i],s[j]);rep(i,1,n)vis[i]=1,dfs(i,1,sqrt(s[i].x*s[i].x+s[i].y*s[i].y) ),vis[i]=0;printf("%.2lf",mind);return 0; } View Code
轉(zhuǎn)載于:https://www.cnblogs.com/bxd123/p/10662026.html
總結(jié)
以上是生活随笔為你收集整理的P1433 吃奶酪 回溯法 优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷 - P1433 - 吃奶酪 - d
- 下一篇: 野路子码农系列(3)plotly可视化的