POJ 3752 字母旋转游戏 模拟
2016-08-30 22:33
330 查看
字母旋转游戏
Description
给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5,N=8时,矩阵中的内容如下:
Input
M为行数,N为列数,其中M,N都为大于0的整数。
Output
分行输出相应的结果
Sample Input
Sample Output
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");
}
}
}
刷题长见识,读题需仔细,不可想得太天真。
特记下,以备后日回顾。
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8274 | Accepted: 3134 |
给定两个整数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");
}
}
}
刷题长见识,读题需仔细,不可想得太天真。
特记下,以备后日回顾。
相关文章推荐
- POJ 3752 字母旋转游戏
- POJ 3752 字母旋转游戏
- POJ 3752 字母旋转游戏 G++
- POJ 3752 字母旋转游戏
- poj 3752 字母旋转游戏 类似搜索
- poj 3752 字母旋转游戏
- SDUT 2254 字母旋转游戏(&&POJ 3752)
- poj 3752 字母旋转游戏 回溯
- poj 3752字母旋转游戏
- POJ 3752 字母旋转游戏(模拟/动态数组)
- poj 3752 字母旋转游戏
- POJ 3752 字母旋转游戏
- poj 3752 字母旋转游戏(蛇形填数)
- POJ 3752 字母旋转游戏
- POJ 3752 字母旋转游戏
- poj1509 Glass Beads 找最小的字母边转移
- POJ 1159 最少添加几个字母构成回文 DP
- POJ2388map的应用统计树的百分比,并按照字母顺序输出
- POJ 3752 解题报告
- POJ 3049(输出字母)