POJ 字母旋转游戏

字母旋转游戏
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值