题意:给出起点坐标与若干个点的位置,从起点出发经过那若干个点之后在回到起点的最短路程,只能向上下左右走一个格。
思路:深搜+回溯。
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct node
{
int x;
int y;
}p[500];
int len,tmp,sx,sy;
int n,vis[500];
void dfs(int nowL,int num,int x,int y)//目前长度,数量,现在的位置坐标
{
if(num==n)
{
len=abs(sx-x)+abs(sy-y);
len+=nowL;
if(len<tmp)//回溯长度比较
tmp=len;
return ;
}
for(int i=0;i<n;i++)
if(!vis[i])//未被访问
{
vis[i]=1;
len=abs(p[i].x-x)+abs(p[i].y-y);
dfs(len+nowL,num+1,p[i].x,p[i].y);
vis[i]=0;// 回溯
}
}
int main()
{
int t;
int mx,my;
cin>>t;
while(t--)
{
len=0;
tmp=9999999;
memset(vis,0,sizeof(vis));
cin>>mx>>my;
cin>>sx>>sy;
cin>>n;
for(int i=0;i<n;i++)
cin>>p[i].x>>p[i].y;
dfs(0,0,sx,sy);
cout<<"The shortest path has length "<<tmp<<endl;
}
return 0;
}