模拟放数过程,从大往小放。
先放最外层,最外层有可能不会被放满,然后逐步的往里放,一直到第一层为止。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int dp[100001]; void chu(int n,int m) { int i,j; for(i=1; i<=m; i++) { dp[i]=min(i,n); } int st=n-1; for(j=st; j>=1; j--) { dp[i+st-j]=j; } } int main() { int n,m,k; int leap=0; int i,j; int step; while(~scanf("%d %d %d%*c",&n,&m,&k)) { if(m<n) { leap=1; swap(m,n); } chu(n,m); int sum=0; step=0; for(i=1; i<=n+m-1; i++) { sum+=dp[i]; step+=dp[i]*i; if(sum>=k)break; } int biao; biao=i; int need=dp[i]-(sum-k); step-=(sum-k)*i; cout<<step<<endl; int ii,jj; int st; int ll; for(i=1;i<=need;i++) { ii=1,jj=1; ll=0; st=biao; while(st--) { if(leap==0)printf("(%d,%d)",ii,jj); else printf("(%d,%d)",jj,ii); if(ll==0)jj++; else ii++; if(jj==min(biao,m)-i+2) { jj--; ll=1; ii++; } } cout<<endl; } for(i=biao-1; i>=1; i--) { for(j=1; j<=dp[i]; j++) { st=i; ii=1,jj=1; ll=0; while(st--) { if(leap==0)printf("(%d,%d)",ii,jj); else printf("(%d,%d)",jj,ii); if(ll==0)jj++; else ii++; if(jj==min(i,m)+2-j) { jj--; ll=1; ii++; } } cout<<endl; } } } return 0; }
Codeforces Round #229 (Div. 2)
原文:http://blog.csdn.net/rowanhaoa/article/details/19293053