- 在线时间
- 67 小时
- 最后登录
- 2017-7-6
- 注册时间
- 2007-11-12
- 听众数
- 7
- 收听数
- 0
- 能力
- 0 分
- 体力
- 10731 点
- 威望
- 3 点
- 阅读权限
- 100
- 积分
- 3435
- 相册
- 0
- 日志
- 59
- 记录
- 19
- 帖子
- 262
- 主题
- 21
- 精华
- 0
- 分享
- 5
- 好友
- 203
群组: Matlab讨论组 群组: 小草的客厅 群组: 数学趣味、游戏、IQ等 群组: C 语言讨论组 群组: 我行我数 |
发一个回旋矩阵的两种算法吧。实现的功能就是,输入一个整数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; }
欢迎大家批评指正,如有更好的方法恳请赐教,小生在此谢过 |
|