题意:
给出n*m的空网格,以及k颗糖果,第一格是(1,1),从(1,1)出发,每次只能走相邻的网格,将糖果放到网格上,一旦放上就不可以移动,每放置一颗糖果需要走的距离就是从(1,1)到(i,j)的距离,即i+j-1
求放置k颗糖果所要走的最小距离
输出最小距离以及路径
注意:如果这个网格上已经有糖果放着了,就不能走过去,相当于存在一个障碍
解题思路:
从(1,1)走到对角线上的任意一点的最小距离是一样的
每次输出时,一条对角线从上往下输出,这样顺序就不会乱
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> using namespace std; #define ll __int64 struct node { int x,y; }a[2505]; bool cmp(node a,node b) { return a.x+a.y<b.x+b.y; } int main() { int n,m,k; scanf("%d%d%d",&n,&m,&k); int p=1; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { a[p].x=i; a[p].y=j; p++; } } sort(a+1,a+n*m+1,cmp); // for(int i=1;i<=n*m;i++) // { // cout<<a[i].x<<" "<<a[i].y<<endl; // } int sum=0; for(int i=1;i<=k;i++) { sum+=(a[i].x+a[i].y-1); } printf("%d\n",sum); for(int i=k;i>=1;i--) { for(int j=1;j<=a[i].x;j++) { printf("(%d,1) ",j); } for(int l=2;l<=a[i].y;l++) { printf("(%d,%d) ",a[i].x,l); } cout<<endl; } return 0; }