数据量很小,直接全排列枚举前往点的顺序,再按照path顺序遍历所有点求出答案,时间复杂度为O(n!*n);
#include <bits/stdc++.h>
using namespace std;
int n;
int sx,sy;
int a[11],b[11];
vector<int>path;
bool vis[11];
int ans;
void upd()
{
int curans = 0;
int cx =sx,cy=sy;
for(auto i:path)
{
curans += abs(cx-a[i])+abs(cy-b[i]);
cx =a[i];
cy = b[i];
}
curans += abs(cx-sx)+abs(cy-sy);
ans = min(ans,curans);
}
void dfs()
{
if(path.size()==n)
{
upd();
return ;
}
for(int i=1;i<=n;i++)
{
if(vis[i])continue;
path.push_back(i);
vis[i]=true;
dfs();
path.pop_back();
vis[i]=false;
}
}
void solve()
{
ans = INT_MAX;
int sz1,sz2;
cin>>sz1>>sz2;
cin>>sx>>sy;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
}
dfs();
cout<<"The shortest path has length ";
cout<<ans<<endl;
}
int main()
{
int _;
cin>>_;
while(_--)
{
solve();
}
return 0;
}

京公网安备 11010502036488号