南邮 OJ 1183 蛇形矩阵

蛇形矩阵

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 489            测试通过 : 68 

比赛描述

给定两个整数MN,生成一个M*N的矩阵,矩阵中元素取值为AZ26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5N=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为列数,其中0<MN<100

输出

输出相应的矩阵,每个字母占4列,即每一个字母前面有三个空格。

样例输入

6 3

样例输出

   A   B   C
   N   O   D
   M   Q   E
   L    R   F
   K   P   G
   J    I   H

提示

 

题目来源

李鸿斌(honghu)



#include<iostream>
using namespace std;
int main(){
	char c[100][100]={0},a='A',i=0,j=0,dir;
	int m,n,temp_m,temp_n;
	scanf("%d %d",&m,&n);
	temp_m = m-1;
	temp_n = n;
	dir = 0;
	while(c[i][j]==0 && temp_n && temp_m){
		c[i][j] = a;
		if(++a>'Z'){
			a = 'A';
		}
		switch(dir){
			case 0:				//右
				if(j+1<n && c[i][j+1]==0){
					++j;
				}else{
					++i;
					--temp_n;
					dir = 1;
				}
				break;
			case 1:				//下
				if(i+1<m && c[i+1][j]==0){
					++i;
				}else{
					--j;
					--temp_m;
					dir = 2;
				}
				break;
			case 2:				//左
				if(j-1>=0 && c[i][j-1]==0){
					--j;
				}else{
					--i;
					--temp_n;
					dir = 3;
				}
				break;
			case 3:				//上
				if(i-1>=0 && c[i-1][j]==0){
					--i;
				}else{
					++j;
					--temp_m;
					dir = 0;
				}
				break;
		}
	}
	if(temp_m==0){
		if(dir==0){
			while(j<n && c[i][j]==0){
				c[i][j] = a;
				if(++a>'Z'){
					a = 'A';
				}
				++j;
			}
		}else{
			while(j>=0 && c[i][j]==0){
				c[i][j] = a;
				if(++a>'Z'){
					a = 'A';
				}
				--j;
			}
		}
	}
	while(temp_m){
		switch(dir){
			case 1:			//下
				while(i+1<m && c[i+1][j]==0){
					++i;
				}
				dir = 3;
				--temp_m;
				break;
			case 3:			//上
				while(i-1>=0 && c[i-1][j]==0){
					--i;
				}
				dir = 1;
				--temp_m;
				break;
		}
		c[i][j] = a;
		if(++a>'Z'){
			a = 'A';
		}
	}
	for(i=0;i<m;++i){
		for(j=0;j<n;++j){
			printf("   %c",c[i][j]);
		}
		putchar('\n');
	}
}





你可能感兴趣的:(ACM,蛇形矩阵,南邮OJ)