2938: 字母旋转游戏


描述
给定两个整数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
输入
M为行数,N为列数,其中M,N都为大于0的整数,M和N不大于50。
输出
分行输出相应的结果
样例输入
4 9
样例输出

   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


思路:定义一个二位数组表示该矩阵,我定义的是一个二位整形数组,当然你也可以定义一个二位的字符数组.然后可以深搜的去旋转改变数组里的数值,当然也可以模拟路径去改变数值,下面我给出了两种方法的源码(ps:代码写的不好别喷哦),我是在堆里定义的数组,所以初始里面全是0,于是我就用1~26表示26个字母,当然你也可以去显示的初始化,那样你初始化为-1,就可以用0~25表示26个字母,这样更方便.

//深搜
#include <iostream>
#include <cstdio>
using namespace std;
int M,N;
int a[50][50];
int dx[] = {1,0,-1,0};
int dy[] = {0,1, 0, -1};
void dfs(int y,int x,int n,int flag)
{
    if(n>M*N || a[y][x] != 0 || x<0 || y<0 ||
       x>=N || y>=M)
        return ;
    a[y][x] = n%26+1;
    n++;
    if(flag == 3)	//如果向上走,那么就继续向上
        dfs(y+dy[3],x+dx[3],n,3);
    for(int i= 0 ; i < 4; i++)
    {
        dfs(y+dy[i],x+dx[i],n,i);
    }
}
int main()
{
    cin>>M>>N;
    dfs(0,0,0,0);
    for(int i= 0 ; i < M ; i++)
    {
        for(int j = 0 ; j < N ;j++)
        {
            printf("   %c",a[i][j]+'A'-1);
        }
        printf("\n");
    }
}

//模拟
#include <iostream>
#include <cstdio>
using namespace std;
int a[50][50];
int main()
{
    int i , j , k ,  m , n;
    int flag = 0;//0向→,1向↓,2向←,3向↑
    cin>>m>>n;
    i = j = 0;
    for(k = 0 ; k < n*m ; k++)
    {
        if(flag == 0)
        {
            a[i][j++] = k%26+1;
            if(j==n || a[i][j]!=0)
            {
                flag = 1;
                i++;
                j--;
            }
        }
        else if(flag == 1)
        {
            a[i++][j] = k%26+1;
            if(i==m || a[i][j]!=0)
            {
                flag = 2;
                j--;
                i--;
            }
        }
        else if(flag == 2)
        {
            a[i][j--] = k%26+1;
            if(j < 0 || a[i][j] !=0)
            {
                flag = 3;
                i--;
                j++;
            }
        }
        else if(flag == 3)
        {
            a[i--][j] = k%26+1;
            if(i < 0 || a[i][j]!=0)
            {
                flag = 0;
                i++;
                j++;
            }
        }
    }
    for(i = 0 ; i  < m ; i++)
    {
        for(j = 0 ; j < n ; j++)
        {
            printf("   %c",a[i][j]+'A'-1);
        }
        printf("\n");
    }
    return 0;
}

一学妹让我帮她改了一代码后从其基础上又得到下面代码:

#include <cstdio>
#include <iostream>
using namespace std;
const int MAX_N=100;
int a[MAX_N][MAX_N];
int main()
{
    int m,n,tot=0,x=0,y=0;
    a[0][0] = 1;
    cin>>m>>n;
    while(tot<n*m-1)
    {
        while(y+1<n && a[x][y+1]==0)
            a[x][++y]=(++tot)%26+1;
        while(x+1<m && a[x+1][y]==0)
            a[++x][y]=(++tot)%26+1;
        while(y-1>=0 && a[x][y-1]==0)
            a[x][--y]=(++tot)%26+1;
        while(x-1>=0 && a[x-1][y]==0)
            a[--x][y]=(++tot)%26+1;
    }
    for(x=0;x<m;x++)
    {
        for(y=0;y<n;y++)
        {
            printf("   %c",a[x][y]+'A'-1);
        }
        printf("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值