题目说了最多10个点,直接暴搜
#include <bits/stdc++.h>
using namespace std;
const int N=1e2+10;
const int INF=0x3f3f3f3f;
bool vis[N];
int n,m,mp[N][N];
struct node{
int x,y;
int operator - (const node& b)const{//重载 两点间的距离
return abs(x-b.x)+abs(y-b.y);
}
}a[N];
int ans=0,cnt=0;
void dfs(int cur,int k,int sum){//当前坐标点 已经收集过的个数 步数总和
if(sum>=ans) return;//剪枝
if(k==cnt){
ans=min(ans,sum+(a[cur]-a[0]));//sum+返回起点
return;
}
for (int i = 1; i <= cnt; ++i) {
if(!vis[i]){
vis[i]=true;
dfs(i,k+1,sum+(a[cur]-a[i]));
vis[i]=false;
}
}
}
int main(){
while(cin>>n>>m){
memset(mp, 0, sizeof(mp));
cnt=0;
ans=INF;
a[0]={0,0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin>>mp[i][j];
if(mp[i][j]){
a[++cnt]={i,j};
}
}
}
dfs(0,0,0);
cout<<ans<<endl;
}
return 0;
}