codeforces 390d Inna and Sweet Matrix

来源:互联网 发布:淘宝如何改主营类目 编辑:程序博客网 时间:2024/05/17 04:30

题目链接

题意:

给出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 __int64struct 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;}


0 0