模拟放数过程,从大往小放。
先放最外层,最外层有可能不会被放满,然后逐步的往里放,一直到第一层为止。
#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;
}