【题目描述】
如下为规模为4的螺旋矩阵:
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
求规模为n(n<=15)(注意:每个元素需要4个位,也就是要用%4d)
【输入格式】
输入一个整数n
【输出格式】
输出规模为n的螺旋矩阵。
样例输入
4
样例输出
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
#include <stdio.h>
#include <iostream>
using namespace std;
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
//下,右,上,左
int a[100][100];
int n;
int k = 2;
int i = 0;
void dfs(int x, int y)
{
if (k > n * n)
return;
while (1)
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (0 <= nx && nx < n && 0 <= ny && ny < n && a[nx][ny] == 0)
{
a[nx][ny] = k;
k++;
dfs(nx, ny);
break;
}
else
{
i = (i + 1) % 4;
}
}
}
int main()
{
scanf("%d", &n);
a[0][0] = 1;
dfs(0, 0);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%4d", a[i][j]);
}
cout << endl;
}
return 0;
}
参考这个改改
#include
using namespace std;
const int nmax = 50;
int a[nmax][nmax];//定义一个二维数组来装数字后直接打印
int n;//参数n
/*
思路:通过分析可知“创建n阶螺旋矩阵并输出”当n>2以后可以用递归分为两部分来实现,一个是外层的实现,一个是内层的递归
参数:
1,n
2,num0 用来确定输出的数字
3,len 用来表示当前调用的是哪个递归
4, m 用来确定输出坐标
*/
void HelixMatrix(int n, int num0, int len, int m) {
if (len == 1) {
a[m][m] = num0;
return;
}
if (len == 2) {
a[m][m] = num0++;
a[m][m + 1] = num0++;
a[m + 1][m + 1] = num0++;
a[m + 1][m] = num0;
return;
}
int x = m;//坐标最小值
int y = n + 1 - m;//坐标最大值(第一层的时候是n,第二层是n-1,第三层是n-2.......
int tmp = num0;//不要随便改变传入参数的值
if (len >= 3) {
//上面
for (int i = x; i <= y; i++) {
a[x][i] = tmp;
tmp++;
}
//右边
for (int i = x + 1; i <= y; i++) {
a[i][y] = tmp;
tmp++;
}
//下面
for (int i = y - 1; i >= x; i--) {
a[y][i] = tmp;
tmp++;
}
//左边
for (int i = y - 1; i >= x + 1; i--) {
a[i][x] = tmp;
tmp++;
}
HelixMatrix(n, tmp, len-2, m+1);
}
}
int main()
{
while (1) {
cin >> n;//输入n
if (n == 0) {//输入0结束
printf("请输入有效值\n");
break;
}
//调用函数
HelixMatrix(n, 1, n, 1);
//打印
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
printf("%5d", a[i][j]); //输出右对齐
}
cout << endl;
}
printf("\n");
}
system("pause");
return 0;
}