QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6121|回复: 3
打印 上一主题 下一主题

回旋矩阵的算法

[复制链接]

21

主题

7

听众

3435

积分

新人进步奖 优秀斑竹奖

群组Matlab讨论组

群组小草的客厅

群组数学趣味、游戏、IQ等

群组C 语言讨论组

群组我行我数

跳转到指定楼层
1#
发表于 2011-5-29 19:24 |只看该作者 |倒序浏览
发一个回旋矩阵的两种算法吧。实现的功能就是,输入一个整数N,返回一个回旋矩阵。
所谓回旋矩阵呢,举个例子就知道了:3×3的矩阵
1 2 3
8 9 4
7 6 5
4×4的矩阵:
1  2  3   4
12 13 14  5
11 16 15  6
10  9  8  7

第一种算法:递归算法:
#include <stdio.h>

void ptr(int n,int c,int s,int a[100][100]) {
    int i;
    if(n>2) {
        for(i=0; i<n; i++){
                a[c][c+i] = s;
                        s++;
        }
            
        for(i=1; i<n; i++){
                 a[c+i][c+n-1] = s;
                 s++;
        }
           
        for(i=2; i<=n; i++){
                a[c+n-1][c+n-i] = s;
                    s++;
        }
            
        for(i=2; i<n; i++){
                a[n-i+c][c] = s;
                    s++;
                  
        }
            
        n -= 2, c++;
        ptr(n,c,s,a); }
    else if(n == 2) {
        a[c][c] = s;
        a[c+1][c] = s+1;
        a[c+1][c+1] = s+2;
        a[c][c+1] = s+3; }
    else if(n == 1) {
        a[c][c] = s; } }

int main() {
    int n, a[100][100], i, j;
    scanf("%d",&n);
    ptr(n,0,1,a);
    for(i=0; i<n; i++) {
        for(j=0; j<n; j++)
            printf("%4d",a[i][j]);
        printf("\n"); }
    return 0; }

第二种算法:按照顺时针的方向给矩阵赋值,思想和递归差不多
#include<stdio.h>
void convolute(int n,int c,int s,int a[100][100]){

        if (n==1){
                a[c][c]=s;
        }else if (n==2){
                a[c][c] =s;
                a[c][c+1] =s+1;
                a[c+1][c] =s+3;
                a[c+1][c+1] =s+2;

        }else{
            while (n>=1){
                for (int i=0; i<n; i++){               //向右给矩阵赋值
                        a[c][c+i] = s;
                        s++;
        }
       
        for (int j=0; j<n-1; j++){              //向下给矩阵赋值
               
                        a[c+j+1][c+n-1] =s;
                        s++;
               
        }
       
        for (int k=n-2; k>=0; k--){           //向左给矩阵赋值
                 a[c+n-1][c+k] =s;
                 s++;
        }
       
        for (int l=n-2; l>0; l--){           //向上给矩阵赋值
                a[c+l][c] =s;
                s++;
        }
        c++;
        n-=2;
        }

        }       
}
int main() {
    int n, a[100][100], i, j;
    scanf("%d",&n);
    convolute(n,0,1,a);
    for(i=0; i<n; i++) {
        for(j=0; j<n; j++)
            printf("%4d",a[i][j]);
        printf("\n"); }
    return 0; }

欢迎大家批评指正,如有更好的方法恳请赐教,小生在此谢过
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

0

主题

4

听众

151

积分

群组C 语言讨论组

群组数学建模

群组LINGO

群组Matlab讨论组

群组岩土力学与地下工程

2#
发表于 2011-12-1 09:39 |只看该作者
回复

使用道具 举报

追光祖 实名认证       

0

主题

4

听众

237

积分

群组C 语言讨论组

群组数学趣味、游戏、IQ等

群组每天多学一点点

群组山东科技大学数模联盟

群组文献查询

3#
发表于 2012-5-5 12:55 |只看该作者
回复

使用道具 举报

追光祖 实名认证       

0

主题

4

听众

237

积分

群组C 语言讨论组

群组数学趣味、游戏、IQ等

群组每天多学一点点

群组山东科技大学数模联盟

群组文献查询

4#
发表于 2012-5-5 12:57 |只看该作者
回复

使用道具 举报

qq
收缩
  • 电话咨询

  • 04714969085

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2025-6-1 20:08 , Processed in 0.551222 second(s), 52 queries .

回顶部