旋转数阵
// 双转向旋转方阵递归设计
#include <stdio.h>
int n,a[20][20]={0};
void main()
{ int h,v,b,p,s,d;
printf(" 请选择方阵阶数n:");
scanf("%d",&n);
printf(" 请选择转向,顺转1,逆转2:");
scanf("%d",&p);
b=1;s=n;d=1;
void t(int b,int s,int d); // 递归函数说明
t(b,s,d);
if(p==1) // 按要求输出旋转方阵
printf(" %d阶顺转方阵: \n",n);
else
printf(" %d阶逆转方阵: \n",n);
for(h=1;h<=n;h++)
{ for(v=1;v<=n;v++)
if(p==1)
printf(" %3d",a[h][v]);
else
printf(" %3d",a[v][h]);
printf("\n");
}
return;
}
void t(int b,int s,int d) // 定义递归函数
{ int j,h=b,v=b;
if(s==0) return; // s=0,1时为递归出口
if(s==1)
{ a[b][b]=d;return;}
for(j=1;j<s;j++) // 一圈的上行从左至右递增
{ a[h][v]=d;v++;d++;}
for(j=1;j<s;j++) // 一圈的右列从上至下递增
{ a[h][v]=d;h++;d++;}
for(j=1;j<s;j++) // 一圈的下行从右至左递增
{ a[h][v]=d;v--;d++;}
for(j=1;j<s;j++) // 一圈的左行从下至上递增
{ a[h][v]=d;h--;d++;}
t(b+1,s-2,d); // 调用内圈递归函数
}
// m×n顺转矩阵递归设计
#include <stdio.h>
int m,n,a[20][20]={0};
void main()
{ int h,v,b,s,d;
printf(" 数阵为m行n列,请确定m,n:");scanf("%d,%d",&m,&n);
s=m>n?n:m;
b=1;d=1;
void t(int b,int s,int d); // 递归函数说明
t(b,s,d); // 调用递归函数
printf(" %d×%d顺转矩阵: \n",m,n);
for(h=1;h<=m;h++)
{for(v=1;v<=n;v++)
printf(" %3d",a[h][v]);
printf("\n");
}
return;
}
void t(int b,int s,int d) // 定义递归函数
{ int j,h=b,v=b;
if(s<=0) return; // 递归出口
if(s==1 && m==n) // n=m且n为奇数时的递归出口
{ a[h][v]=d;return;}
for(j=1;j<=n+1-2*b;j++) // 一圈的上行从左至右递增
{ a[h][v]=d;v++;d++;}
for(j=1;j<=m+1-2*b;j++) // 一圈的右列从上至下递增
{ a[h][v]=d;h++;d++;}
for(j=1;j<=n+1-2*b;j++) // 一圈的下行从右至左递增
{ a[h][v]=d;v--;d++;
if(d>m*n) break; // min(m,n)为奇数且n>m时停止循环
}
for(j=1;j<=m+1-2*b;j++) // 一圈的左行从下至上递增
{ a[h][v]=d;h--;d++;
if(d>m*n) break; // min(m,n)为偶数或者n<m时停止循环
}
t(b+1,s-2,d); // 调用内一圈递归函数
}