关闭

POJ 3752 字母旋转游戏 模拟

标签: 模拟
249人阅读 评论(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
查看评论

SDUT 2254 字母旋转游戏(&&POJ 3752)

字母旋转方阵 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按...
  • u014361775
  • u014361775
  • 2015-02-05 11:25
  • 552

矩阵问题(题目:SDUT 2744 2254)

最近在刷ACM题目的过程中遇到了好多关于矩阵的问题,确实是把我恶心了一番。         但是从本质上来讲,这种题目难度并不是很大,主要是找规律,之后通过循环来实现。      ...
  • daijingxin
  • daijingxin
  • 2016-07-22 11:29
  • 656

字母旋转方阵

字母旋转方阵 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方...
  • FEATHER2016
  • FEATHER2016
  • 2017-05-18 22:16
  • 258

POJ 3752 字母旋转游戏

给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5,N=8时,矩阵中的内容如下: A B C D E F G H V W ...
  • feizaoSYUACM
  • feizaoSYUACM
  • 2017-03-06 23:42
  • 148

poj 3752 字母旋转游戏

简单的模拟题,只要注意到方向就行了,我直接用一个vis数组来进行边界的控制,所以就不需要对map数组进行判断。 #include #include #include using namespace std; const int N = 100; int row,col; bool vis[N][...
  • purevegetable
  • purevegetable
  • 2013-09-10 12:54
  • 658

字母旋转游戏

Problem Description 给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5,N=8时,矩阵中的内容如下: A B C D ...
  • xcd1997
  • xcd1997
  • 2017-05-03 15:48
  • 160

C语言测试题

Problem A: 位操作Description假设你工作在一个32位的机器上,你需要将某一个外设寄存器的第X位设置成0(最低位为第0位,最高位为第31位),将第Y位开始的连续三位设置成110(从高位到低位的顺序),而其他位保持不变。对给定的寄存器值R,及X,Y,编程计算更改后的寄存器值R。Inp...
  • ysw1234
  • ysw1234
  • 2010-01-27 16:41
  • 990

poj 3752字母旋转游戏

Description给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5,N=8时,矩阵中的内容如下: A B C D E F G H...
  • Terry__J
  • Terry__J
  • 2011-06-15 13:46
  • 584

POJ 3752 字母旋转游戏(模拟/动态数组)

Description给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5,N=8时,矩阵中的内容如下: A B C D E F G H...
  • ChinaCzy
  • ChinaCzy
  • 2010-01-25 01:18
  • 1047

用分治算法确定一个给定的数x是否在矩阵M中

/*设M是一个n*n的整数矩阵,其中每一行(从左到右)和每一列(从上到上)的元素都按升序排列。设计分治算法确定一个给定的整数X是否在M中。*/#include "stdio.h"#define n 4int M[n][n]={{1,2,3,4},{5,6,7,8},{9,10,1...
  • love3e4520
  • love3e4520
  • 2006-12-20 13:06
  • 1169
    个人资料
    • 访问:90959次
    • 积分:1964
    • 等级:
    • 排名:千里之外
    • 原创:109篇
    • 转载:8篇
    • 译文:0篇
    • 评论:9条
    最新评论