2938: 字母旋转游戏

来源:互联网 发布:淘宝有逆战招打手的吗 编辑:程序博客网 时间:2024/05/29 13:56

描述
给定两个整数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;}


0 0