您的位置:首页 > 其它

POJ 3752 字母旋转游戏 模拟

2016-08-30 22:33 330 查看
字母旋转游戏

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
    题意:和普通的蛇形天数类似,但此题严格要求顺时针。

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

    以数据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");
}
}
}
    刷题长见识,读题需仔细,不可想得太天真。
    特记下,以备后日回顾。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: