关闭

POJ 3752 字母旋转游戏 模拟

标签: 模拟
206人阅读 评论(0) 收藏 举报
分类:

字母旋转游戏
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 8274   Accepted: 3134

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

Source

    题意:和普通的蛇形天数类似,但此题严格要求顺时针。

    分析:由于严格要求顺时针,所以在只剩最后一列需要填数时,所填数字并不是连续的,即还是得执行右下左上的顺序,尽管左右操作并没有产生新的填数,当最后一列中空的最上一个元素填完之后,需要一直遍历到最下一个数填数,即模拟了向右操作。本题需要注意的是严格顺时针。

    以数据6 3为例,生成数据应为:

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

    给出代码略繁琐,仍可优化,见AC代码:

//wa 点  最后一列的处理需注意
#include<stdio.h>
#include<string.h>
const int maxn=105;
char a[maxn][maxn];
int vis[maxn][maxn];
int main()
{
	int m,n;
	while(~scanf("%d%d",&m,&n))
	{
		memset(vis,0,sizeof(vis));
		int cnt=2;
		a[0][0]='A';
		vis[0][0]=1;
		int x=0,y=0,flag=1;
		while(cnt<=m*n)
		{
			int l=0,r=0;
			while(y+1<n&&!vis[x][y+1])//右
			{
				if(cnt%26)
					a[x][++y]=(cnt%26-1)+'A';
				else
					a[x][++y]='Z';
				vis[x][y]=1;
				cnt++;
				r++;
			}
			if(r==1||r==0)//到了最后一列 
				break;
			while(x+1<m&&!vis[x+1][y])//下
			{
				if(cnt%26)
					a[++x][y]=(cnt%26-1)+'A';
				else
					a[++x][y]='Z';
				vis[x][y]=1;
				cnt++;
			}
			while(y-1>=0&&!vis[x][y-1])//左
			{
				if(cnt%26)
					a[x][--y]=(cnt%26-1)+'A';
				else
					a[x][--y]='Z';
				vis[x][y]=1;
				cnt++;
				l++;
			}
			if(l==1||l==0)//到最后一列 
				break;
			while(x-1>=0&&!vis[x-1][y])//上
			{
				if(cnt%26)
					a[--x][y]=(cnt%26-1)+'A';
				else
					a[--x][y]='Z';
				vis[x][y]=1;
				cnt++;
			}
		}
		while(cnt<=m*n)
		{
			int n1=0,n2=0;
			while(x+1<m&&!vis[x+1][y])//下
			{//向下找到最后一个没有填的数 
				x++;
				n1++;
			}
			if(n1)//如果向下操作找到了符合要求的数的话 
			{
				if(cnt%26)
					a[x][y]=(cnt%26-1)+'A';
				else
					a[x][y]='Z';
				cnt++;
				vis[x][y]=1;
			}
			while(x-1>=0&&!vis[x-1][y])//上
			{//向上找到最后一个没有填的数 
				x--;
				n2++;
			}
			if(n2) 
			{
				if(cnt%26)
					a[x][y]=(cnt%26-1)+'A';
				else
					a[x][y]='Z';
				vis[x][y]=1;
				cnt++;
			}
		}
		for(int i=0; i<m; i++)
		{
			for(int j=0; j<n; j++)
				printf("   %c",a[i][j]);
			printf("\n");
		}
	}
}
    刷题长见识,读题需仔细,不可想得太天真。

    特记下,以备后日回顾。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:75694次
    • 积分:1825
    • 等级:
    • 排名:千里之外
    • 原创:109篇
    • 转载:8篇
    • 译文:0篇
    • 评论:9条
    最新评论