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