1. 程式人生 > >題解 P1433 【吃奶酪】

題解 P1433 【吃奶酪】

現在 continue == 理解 距離 搜索 宇宙 思想 mes

題解 P1433 【吃奶酪】

首先,我確定我的不是最優解,但最好寫。看到樓上DALAO用記憶化搜索和狀壓DP本蒟蒻感到瑟瑟發抖,這好似是一個簡單的DFS問題,乍一看數據我稍有擔憂,但是洛谷有全宇宙最快的評測機我就放心提交了。(第9個點400ms)詳情看代碼。

#include<bits/stdc++.h>
using namespace std;
bool book[105];int shu;//book用來記錄這個點是否到過、
double ans=10000;//ans要初始化
struct point{
    double x,y;
}a[105];//用一個結構體記錄點更直觀,看到別的DALAO用二維數組感覺不好理解。這裏就是a[i].x/a[i].y代表第i個點的x/y坐標。
double ls(int id1,int id2)
{
    return sqrt((a[id1].x-a[id2].x)*(a[id1].x-a[id2].x)*1.0+(a[id1].y-a[id2].y)*(a[id1].y-a[id2].y)*1.0);
}//結構體版的兩點距離公式
void dfs(int now,int k,double s)//now代表現在所處在點的id,k代表下一個的id,s就是路程
{
    if(s>ans)return;//如果距離已經大於ans了就可以返回了。剪枝思想
    if(k>=shu)
    {
        ans=min(ans,s);
        return;
    }//計算長度
    for(int i=1;i<=shu;i++)
    {
        if(book[i]==1)continue;//如果到過就返回
        s+=ls(now,i);book[i]=1;//存儲狀態
        dfs(i,k+1,s);
        s-=ls(now,i);book[i]=0;//恢復狀態
    }
}
int main()//簡潔的主函數
{
    a[0].x=0;
    a[0].y=0;//初始化出發點
    cin>>shu;
    for(int i=1;i<=shu;i++)
        cin>>a[i].x>>a[i].y;//輸入數
    book[0]=1;//保存出發點狀態
    dfs(0,0,0.0);//dfs
    printf("%.2lf",ans);//輸出
}

  

題解 P1433 【吃奶酪】