数学建模社区-数学中国
标题:
回旋矩阵的算法
[打印本页]
作者:
水木年华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