题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3682
题目大意: 有一个n*m的格子(n<=m)接下来输入n*n 行,每行表示一个点的坐标,求用这些点组成n*n的正方形的所需走的最小距离,点只能横着移动。
水题,暴力解决~~
贴代码:
#include<cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
struct node
{
int x;
int y;
}p[4000];
bool cmp(node a,node b){
if(a.x < b.x) return true;
else if(a.x == b.x){
if(a.y < b.y) return true;
return false;
}
return false;
}
int main()
{
int n, m;
while(~scanf("%d %d", &n, &m) && n+m)
{
for(int i = 0; i < n *n ; i++)
{
scanf("%d %d", &p[i].x, &p[i].y);
}
sort(p,p+n*n,cmp);
int mi = inf;
for(int i = 1;i <= (m - n + 1) ; i++){
int sum = 0;
//int temp = i;
for(int z = 0;z < n; z ++)
{
int temp = i;
for(int j = 0; j < n; j ++)
{
sum = sum + abs(p[z * n + j].y - temp);
temp ++;
}
}
if(mi > sum) mi = sum;
}
printf("%d\n", mi);
}
return 0;
}