数学建模社区-数学中国

标题: 回旋矩阵的算法 [打印本页]

作者: 水木年华zzu    时间: 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; }

欢迎大家批评指正,如有更好的方法恳请赐教,小生在此谢过
作者: 心我所想    时间: 2011-12-1 09:39

作者: 追光祖    时间: 2012-5-5 12:55

作者: 追光祖    时间: 2012-5-5 12:57
已经够厉害了。。。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5