日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P1433 吃奶酪 回溯法 优化

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1433 吃奶酪 回溯法 优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  

題目描述

房間里放著n塊奶酪。一只小老鼠要把它們都吃掉,問至少要跑多少距離?老鼠一開始在(0,0)點處。

輸入輸出格式

輸入格式:

?

第一行一個數n (n<=15)

接下來每行2個實數,表示第i塊奶酪的坐標。

兩點之間的距離公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

?

輸出格式:

?

一個數,表示要跑的最少距離,保留2位小數。

?

輸入輸出樣例

輸入樣例#1:?復制 4 1 1 1 -1 -1 1 -1 -1 輸出樣例#1:?復制 7.41

一開始回溯法顯然超時
然后加了一個剪枝勉強能過
不過花了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 ;//關鍵剪枝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的回溯法就接近爆時間

加上一個剪枝可以進行一定程度的優化
預處理兩點距離即可
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 ;//關鍵剪枝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

轉載于:https://www.cnblogs.com/bxd123/p/10662026.html

總結

以上是生活随笔為你收集整理的P1433 吃奶酪 回溯法 优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。