字母旋转游戏
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3271 | Accepted: 1163 |
Description
给定两个整数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
Input
M为行数,N为列数,其中M,N都为大于0的整数。
Output
分行输出相应的结果
Sample Input
4 9
Sample Output
A B C D E F G H I V W X Y Z A B C J U J I H G F E D K T S R Q P O N M L
我的分析:
这题较为简单,但从discuss了解到,主要问题是超时,通过动态创建数组可以解决这一问题。在对矩阵赋值时,可以设置方向变量控制行列的变化。
为了跳出循环我的程序设置了变量cnt ,当该值大于3时,说明矩阵已经全部被赋值啦。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
char C[27] = { 'a','A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int main()
{
int M,N;
int i,j;
int ch=1;
int flag; // 记录当前方向
int cnt;
char **array;
int **state;
scanf("%d%d",&M,&N);
// cin>>M>>N;
array = new char *[M];
state = new int *[M];
for( i=0; i<M; i++ )
{
array[i] = new char[N];
state[i] = new int[N];
// memset( state[i],0,sizeof(state[i]));
}
for( i=0; i<M; i++ )
for( j=0; j<N; j++ )
state[i][j]=0;
i=0;
j=0;
cnt=0;
flag=0; // 0 从左往右 1 上倒下 2 右往左 3 下往上
while( true )
{
if( cnt>=3)
break;
if( i<M && j<N && i>=0 && j>=0 && state[i][j] == 0 )
{
cnt=0;
array[i][j] = C[ch];
state[i][j] = 1;
if( flag == 0)
{
j++;
}
else if( flag == 1 )
{
i++;
}
else if( flag == 2 )
{
j--;
}
else if( flag == 3 )
{
i--;
}
ch++;
if( ch>=27 )
{
ch = 1;
}
}
else
{
cnt++;
if( flag == 0)
{
j=j-1;
i=i+1;
flag++;
}
else if( flag == 1 )
{
i=i-1;
j=j-1;
flag++;
}
else if( flag == 2 )
{
j++;
i--;
flag++;
}
else if(flag == 3)
{
i++;
j++;
flag=0;
}
}
}
for( i=0; i<M; i++ )
{
for( j=0; j<N; j++ )
{
printf("%4c",array[i][j]);
}
printf("/n");
}
return 0;
}