水题----------字母旋转游戏

给定两个整数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 Input4 9Sample 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

递归写法:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int d[N][N];
int idx;
int n, m;
void dfs(int x, int y){
 int dx[4] = {-1, 0, 1, 0},  dy[4] = {0, 1, 0, -1}; //上右下左 
  if (idx == n * m)   return ;
        if (x == 1 && y == 1){
    for (int i = 1; i <= m; i ++) {
       d[1][i] = ++ idx;
   }      
        y = m; 
}
    for (int i = 0; i < 4; i ++)
      if (x + dx[i] <= n && d[x + dx[i]][y + dy[i]] == 0 && y + dy[i] <= m && x + dx[i] > 0 && y + dy[i] > 0)
        {
    if (i == 0){
          for (int i = x - 1; ; i --){
            d[i][y] = ++ idx;
            x --;
            if (d[i - 1][y] != 0 || i - 1 < 1)   break;
           }
   }
   else  if (i == 1){
    for (int i = y + 1; ; i ++) {
      d[x][i] = ++ idx;
       y ++;
       if (d[x][i + 1] != 0 || i + 1> m)   break;
        }
   }    
         else  if (i == 2){
          for (int i = x + 1; ; i ++){
           d[i][y] = ++ idx;
           x ++;
           if (d[i + 1][y] != 0 || i + 1> n)   break;
    }
   }
   else  if (i == 3){
    for (int i = y - 1; ; i --){
      d[x][i] = ++ idx;
      y --;
      if (d[x][i - 1] != 0 || i - 1< 1)   break;
     }
   } 
    }
      dfs(x, y);    
}
int main(){
 cin >> n >> m;
  memset(d, 0, sizeof d);
  int a = 1, b = 1;
 dfs(1, 1);
 for (int i = 1; i <= n; i ++)
       for (int j = 1; j <= m; j ++){
          d[i][j] = d[i][j] % 26;
          if (d[i][j] == 0)   d[i][j] = 26;
 }
     for (int i = 1; i <= n; i ++ )
    {
        for (int j = 1; j <= m; j ++ ) cout << char(d[i][j] + '0' + 16)<< ' ';
        cout << endl;
    }
  return 0;
}  

递推写法:

#include <iostream>
using namespace std;
int res[100][100];
int main()
{
    int n, m;
    cin >> n >> m;
   int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
   for (int x = 0, y = 0, d = 0, k = 1; k <= n * m; k ++ )
    {
        res[x][y] = k;
        int a = x + dx[d], b = y + dy[d];
        if (a < 0 || a >= n || b < 0 || b >= m || res[a][b])
        {
            d = (d + 1) % 4;
            a = x + dx[d], b = y + dy[d];
        }
        x = a, y = b;
    }
    for (int i = 0; i < n; i ++)
       for (int j = 0; j < m; j ++){
          res[i][j] %= 26;
          if (res[i][j] == 0)   res[i][j] = 26;
 }
     for (int i = 0; i < n; i ++ )
    {
        for (int j = 0; j < m; j ++ ) cout << char(res[i][j] + '0' + 16)<< ' ';
        cout << endl;
    }
     return 0;
}
发布了164 篇原创文章 · 获赞 112 · 访问量 6783

猜你喜欢

转载自blog.csdn.net/qq_45772483/article/details/105369268