一.编程打印如图所示的n×n的方阵。
如图为顺时针螺旋:
算法思想:先把图形分成几个圈,及“1~12”为第一圈,“13~16”为第二圈;并定义下标变量是i,由于n与圈数的关系,(例如n=3、4均为两圈),所以下标变量范围1~(n+1)/2。
(1)i行,从i列到n-i列 (n=4,i=1时“摆放1,2,3”) 上方
(2)n+1-i列,从i行到n-i行 (n=4,i=1时“摆放4,5,6”) 右侧
(3)n+1-i行,从n+1-i行到i+1列(n=4,i=1时“摆放7,8,9”)下方
(4)i列,从n+1-i行到i+1行 (n=4,i=1时“摆放10,11,12”)左侧
程序如下:
#include<stdio.h>
void main()
{
int i,j,a[100][100],n,k;
printf("输入n的值:");
scanf("%d",&n);
k=1;
for(i=1;i<=n/2;i=i+1)
{
for(j=i;j<=n-i;j=j+1) //上方
{
a[i][j]=k;
k=k+1;
}
for(j=i;j<=n-i;j=j+1) //右侧
{
a[j][n-i+1]=k;
k=k+1;
}
for(j=n-i+1;j>=i+1;j=j-1) //下方
{
a[n-i+1][j]=k;
k=k+1;
}
for(j=n-i+1;j>=i+1;j=j-1) //左侧
{
a[j][i]=k;
k=k+1;
}
}
if(n%2==1)
{
i=(n+1)/2;
a[i][i]=n*n;
}
for(i=1;i<=n;i=i+1)
{
for(j=1;j<=n;j=j+1)
printf("%4d",a[i][j]);
printf("\n");
}
printf("\n");
}
若想要做一个逆时针的螺旋矩阵,只需要改改逻辑值就好了
二.C++深度优先搜索版m*n的螺旋矩阵(其中填充的东西是A~Z循环填写)
eg:
#include <iostream>
#include <vector>
using namespace std;
//四个方向位(右、下、左、上)
int dx[] = { 0, 1, 0, -1 };
int dy[] = { 1, 0, -1, 0 };
//通过计数器来判断是否需要退出
void DFS2(vector<vector<char>>& v, vector<bool>& flag, int x, int y, int m, int n, char chars,int& count){
if (chars > 'Z'){
chars = 'A';
}
v[x][y] = chars;
count++;
if (count == m*n)
return;
for (int i = 0; i<4; i++){
if (flag[i] == true){
int nx = x + dx[i];
int ny = y + dy[i];
if (nx<0 || nx >= m || ny<0 || ny >= n || v[nx][ny] != ' '){
if (i == 3){
flag[0] = true;
flag[i] = false;
i = -1;
}
else{
flag[i + 1] = true;
flag[i] = false;
}
continue;
}
DFS2(v, flag, nx, ny, m, n, chars + 1,count);
if (count == m*n)
return;
}
}
}
int main(){
int m, n;
cin >> m >> n;
vector<vector<char>> v(m, vector<char>(n, ' '));
vector<bool> flag(4);//用来判断使用哪个方向
flag[0] = true;
int count = 0;
DFS2(v,flag, 0, 0, m, n, 'A',count);
for (int i = 0; i<m; i++){
for (int j = 0; j<n; j++){
if (j == n - 1)
cout << v[i][j];
else
cout << v[i][j] << " ";
}
cout << endl;
}
return 0;
}