题意:旅行商问题(求从起点经过每个点一次再返回起点的最短距离)。
思路:暴力。全排列解决。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#include <sstream>
#define INF 1000000000
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
using namespace std;
int x[15];
int y[15];
int tab[]={1,2,3,4,5,6,7,8,9,10,11};
inline int calc(int x1,int y1,int x2,int y2){
return abs(x1-x2)+abs(y1-y2);
}
int main(){
x[0]=y[0]=1;
int n,m;
int cnt;
while(cin>>n>>m){
sort(tab,tab+11);
cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int t;
cin>>t;
if(t){
cnt++;
x[cnt]=i;
y[cnt]=j;
}
}
}
int ans=INF;
while(1){
int tmp=0;
tmp+=calc(x[tab[0]],y[tab[0]],1,1);
for(int i=0;i<cnt-1;i++){
tmp+=calc(x[tab[i]],y[tab[i]],x[tab[i+1]],y[tab[i+1]]);
}
tmp+=calc(x[tab[cnt-1]],y[tab[cnt-1]],1,1);
ans=min(ans,tmp);
int b=next_permutation(tab,tab+cnt);
if(!b)break;
}
cout<<ans<<endl;
}
return 0;
}