描述
给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5,N=8时,矩阵中的内容如下:
A B C D E F G H
V W X Y Z A B I
U J K L M N C J
T I H G F E D K
S R Q P O N M L
输入
每个测试样例包括一行,分别是两个整数M,N,其中M为行数,N为列数,其中0<M,N<100。
输出
每个测试样例输出相应的矩阵,每个字母占4列,即每一个字母前面有三个空格。
样例输入
6 3
样例输出
A B C
N O D
M Q E
L R F
K P G
J I H
N O D
M Q E
L R F
K P G
J I H
这个神坑题,为什么神坑,请看看测试用例。花了我半天多的时间才搞出来,要分不同的状态输出,行大于列还有奇偶数的时候,为了图方便我多了70多行的代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[110][110];
int n,m,N,i,j,k,z;
int ch,fx=0;
int fun()
{
i=j=1;
fx=0;
ch=0;
N=n*m;
memset(a,-1,sizeof(a));
a[1][m+1]=1;
a[n+1][m]=1;
a[n][0]=1;
a[0][0]=1;
while(N > 0)
{
if(fx==0)
{
while(a[i][j]==-1)
{
a[i][j++]=(ch++)%26;
N--;
}
i++;
j--;
}
else if(fx==1)
{
while(a[i][j]==-1)
{
a[i++][j]=(ch++)%26;
N--;
}
i--;
j--;
}
else if(fx==2)
{
while(a[i][j]==-1)
{
a[i][j--]=(ch++)%26;
N--;
}
i--;
j++;
}
else if(fx==3)
{
while(a[i][j]==-1)
{
a[i--][j]=(ch++)%26;
N--;
}
i++;
j++;
}
fx=(fx+1)%4;
}
for(i=1;i<=n;i++)
{ for(j=1;j<m;j++)
printf("%4c",char('A'+a[i][j]));
printf("%4c\n",char('A'+a[i][j]));
}
}
int fun1()
{
i=j=1;
fx=0;
ch=0;
N=n*m;
memset(a,-1,sizeof(a));
a[1][m+1]=1;
a[n+1][m]=1;
a[n][0]=1;
a[0][0]=1;
while(N > n-m)
{
if(fx==0)
{
while(a[i][j]==-1)
{
a[i][j++]=(ch++)%26;
N--;
}
i++;
j--;
}
else if(fx==1)
{
while(a[i][j]==-1)
{
a[i++][j]=(ch++)%26;
N--;
}
i--;
j--;
}
else if(fx==2)
{
while(a[i][j]==-1)
{
a[i][j--]=(ch++)%26;
N--;
}
i--;
j++;
}
else if(fx==3)
{
while(a[i][j]==-1)
{
a[i--][j]=(ch++)%26;
N--;
}
i++;
j++;
}
fx=(fx+1)%4;
}
while(N>=0)
{
while(a[i][m/2+1]==-1)i++;
if( a[i-1][m/2+1]==-1)
a[--i][m/2+1]=(ch++)%26;
N--;
i--;
while(a[i][m/2+1]==-1)i--;
if( a[i+1][m/2+1]==-1)
a[++i][m/2+1]=(ch++)%26;
i++;
N--;
}
for(i=1;i<=n;i++)
{ for(j=1;j<m;j++)
printf("%4c",char('A'+a[i][j]));
printf("%4c\n",char('A'+a[i][j]));
}
}
int main()
{
while(cin>>n>>m)
{
if(n>m&&m%2==1)
fun1();
else fun();
}
return 0;
}