C语言题目 顺时针方向螺旋填充

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言题目 顺时针方向螺旋填充相关的知识,希望对你有一定的参考价值。

求高手解答!O(∩_∩)O谢谢
有简单一点的吗?只调用stdio.h

//螺旋打印数字

#include <stdio.h>

#define  MAX_COLUMN_SIZE 20

int main(void)

int i  , j , k ;

int column ; //用户输入的列数

int numPtrArray[MAX_COLUMN_SIZE][MAX_COLUMN_SIZE] =  0  ; 

int  minSeries   ; //每圈的 每行 每斜线 每竖列 的最小的连续数字的个数 

int  cycleNo = 0 ; //圈号,从第0圈开始数 

int  loopNum = 1 ; //用于螺旋排列的数字 

int  limit ;

puts("请输入列数(3~20):") ;

scanf("%d" , &column) ; 

//检查用户输入(自己完成!!!)

//螺旋写入数字

minSeries = column ;

do

//先写入 行 数字

    for(i=0+cycleNo ; i<minSeries+cycleNo ; i++)

    

     numPtrArray[cycleNo][i] = loopNum++ ; 

       

     minSeries-- ;

    

     //再写入 斜线 数字

     i-- ;

for(j=0+cycleNo ; j<minSeries+cycleNo ; j++)

numPtrArray[j+1][--i] = loopNum++ ; 

minSeries-- ;

//最后写入 列 数字

    for(k=0 ; k<minSeries ; k++)

numPtrArray[--j][cycleNo] = loopNum++ ;  

minSeries-- ;

//下一圈开始

    cycleNo++ ;

 

while(minSeries > 0) ;  

  //打印结果

printf("=====================================\\n") ; //分割线

  limit = column ;

for( i=0 ; i<column ; i++ )

for(j=0 ; j<limit ; j++)

printf("%4d" , numPtrArray[i][j]) ;

printf("\\n") ;

limit-- ; 

return 0 ;

参考技术A 图片看不清,你看看这么写对不对吧
#include <iostream>
#include <iomanip>
using namespace std;

int total=15;
int **ta;
static int value=1;
static int num=0;

int elenum(int n)

if(n==1)return 1;
return n+elenum(n-1);

void test(int *a[],int n)

if(n<1)return;
int i,j;
for(i=num;i<n;i++)

if(value>elenum(total))return;
a[num][i]=value++;

for(j=n-2,i=num+1;j>=num;j--,i++)

if(value>elenum(total))return;

a[i][j]=value++;

for(i=n-2;i>num;i--)

if(value>elenum(total))return;
a[i][num]=value++;

num++;
test(ta,n-2);


int main(int argc, char* argv[])


ta=(int**)malloc(sizeof(int*)*total);
for(int i=0;i<total;i++)

ta[i]=(int*)malloc(sizeof(int)*total);

for(i=0;i<total;i++)
for(int j=0;j<total;j++)
ta[i][j]=0;

test(ta,total);

for(i=0;i<total;i++)

for(int j=0;j<total;j++)

if(ta[i][j]==0)continue;
cout<<std::setw(5)<<ta[i][j];

cout<<endl;

PAT 乙级 1050.螺旋矩阵

题目来源

 

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;mn;且 mn 取所有可能值中的最小值。

输入格式:

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 1,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。

输入样例:

12
37 76 20 98 76 42 53 95 60 81 58 93
 

输出样例:

98 95 93
42 37 81
53 20 76
58 60 76

分析:

1. 确定m和n:

N个正整数,按照大到小的顺序,顺时针螺旋方向填充,形成一个m行n列的矩阵

而且:m×n 等于 N;mn;且 mn 取所有可能值中的最小值。

也就是说,m和n都是N的两个因数,m和n的差值尽可能小,m≥n

 

对N开方运算,得到的结果转成int

比如,N = 12,12在 3和 42 之间

那么对N开方,向下取整,得到的一个结果,就是N的因数之一

 

所以,n = (int) √N , m = N / n

 

2. 数组排序

数据用一个一维数组接收,降序排序

 

3. 生成螺旋矩阵:

假定 m = 4, n = 3

那么我们就生成一个4行3列的二维矩阵:

(00),(00),(00)

(00),(00),(00)

(00),(00),(00)

(00),(00),(00)

按照规律把一维数组arr的数据放入二维数组matrix

left = 0, right = n - 1 = 2;

up = 0, down = m - 1 = 3;

 

 

(1) 先处理最上方,从左到右

up不变,i 的范围是 [left, right] 

赋值给  matrix[up][i]  得到

(98),(95),(93)

(00),(00),(00)

(00),(00),(00)

(00),(00),(00)

第一行处理完了,up++

判断up是否大于down,如果大于,说明已经处理完毕了,可以退出循环

 

 

(2) 然后处理最右边,从右上到右下 

得到

(98),(95),(93)

(00),(00),(81)

(00),(00),(76)

(00),(00),(76)

 

(3) 接着处理最下边,从右到左

得到

(98),(95),(93)

(00),(00),(81)

(00),(00),(76)

(58),(60),(76)

 

(4) 然后处理最左边一列,从下到上得到

(98),(95),(93)

(42),(00),(81)

(53),(00),(76)

(58),(60),(76)

 

这一轮循环就结束了,接着从 (1)开始

 

需要注意的边界(退出循环):

(1)中处理完第一行,up++,判断up与down的关系

(2)中处理完最右边一列,right--,判断right与left的关系

(3)中处理完最下面一行,down--,判断down与up的关系

(4)中处理完最左边一列,left++,判断left与right的关系

如果出现left>right,up>down等类似情况,就终止循环

 

 

4. 输出二维矩阵matrix

 

C++实现:

这里用一个变量cnt来记录一维数组arr的索引

为的是按照顺序,把arr[cnt]赋值到二维矩阵matrix中

  1 #include <iostream>
  2 #include <vector>
  3 #include <algorithm>
  4 #include <cmath>
  5 using namespace std;
  6 int getN(int N) {
  7     int i = sqrt((double)N);
  8     while (i >= 1) {
  9         if (N%i == 0) {
 10             return i;
 11         }
 12         i--;
 13     }
 14     return 1;
 15 }
 16 
 17 
 18 bool cmp(int& a, int& b) {
 19     return a > b;
 20 }
 21 /*
 22 12
 23 37 76 20 98 76 42 53 95 60 81 58 93
 24 */
 25 
 26 int main() {
 27 
 28     int N;
 29     cin >> N;
 30     int n = getN(N);
 31     int m = N / n;
 32     vector<int> arr(N);
 33 
 34 
 35     for (int i = 0; i < N; ++i) {
 36         cin >> arr[i];
 37     }
 38     sort(arr.begin(), arr.end(), cmp);
 39     
 40     vector <vector<int> > matrix(m, vector<int>(n));
 41 
 42     int left = 0;
 43     int right = n - 1;
 44     int up = 0;
 45     int down = m - 1;
 46     int cnt = 0;    // arr的索引
 47 
 48     while (true) {
 49         // 从左往右的一行
 50         for (int i = left; i <= right; ++i) {
 51             matrix[up][i] = arr[cnt];
 52             cnt++;
 53         }
 54         // 上边界大于下边界
 55         up++;
 56         if (up > down) {
 57             break;
 58         }
 59 
 60         // 从右上往右下,靠右的一行
 61         for (int i = up; i <= down; ++i) {
 62             matrix[i][right] = arr[cnt];
 63             cnt++;
 64         }
 65         // 右边界小于左边界
 66         right--;
 67         if (right < left) {
 68             break;
 69         }
 70         // 从右下往左下,底下的一行
 71         for (int i = right; i >= left; --i) {
 72             matrix[down][i] = arr[cnt];
 73             cnt++;
 74         }
 75         // 如果下边界小于边界
 76         down--;
 77         if (down < up) {
 78             break;
 79         }
 80         // 左下到左上,靠左的一行
 81         for (int i = down; i >= up; --i) {
 82             matrix[i][left] = arr[cnt];
 83             cnt++;
 84         }
 85         // 如果左边界大于右边界
 86         left++;
 87         if (left > right) {
 88             break;
 89         }
 90     }
 91     
 92     for (int i = 0; i < m; ++i) {
 93         for (int j = 0; j < n; ++j) {
 94             if (j != 0) {
 95                 cout <<  ;
 96             }
 97             cout << matrix[i][j];
 98         }
 99         if (i != m - 1) {
100             cout << endl;
101         }
102     }
103 
104     return 0;
105 }

 

 

 

Java实现:






以上是关于C语言题目 顺时针方向螺旋填充的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 54. 螺旋矩阵(方向数组,Java)

PAT 乙级 1050.螺旋矩阵

刷题精选:顺时针输出递增数组(螺旋递增升天数组)

刷题精选:顺时针输出递增数组(螺旋递增升天数组)

刷题精选:顺时针输出递增数组(螺旋递增升天数组)

螺旋矩阵