旋转方阵问题
2010-03-20 12:32
267 查看
#include <iostream>
#include <stdlib.h>
#define LEN 20
void fun1(int (&a)[LEN][LEN],int n)
{
int i,j,m;
int s,t;
t=0;
m=n/2;
if(n%2==1) a[m+1][m+1]=n*n;
for(i=1;i<=m;i++)
{
s=n-2*i+1;
for(j=i;j<=n-i;j++)
{
a[i][j]=t+1-i+j;
a[j][n+1-i]=t+1-i+j+s;
a[n+1-i][j+1]=t+3*s-j+i;
a[j+1][i]=t+4*s-j+i;
}
t+=4*s;
}
}
void fun2(int (&a)[LEN][LEN],int n)
{
int i,j,m;
int s,t;
t=0;
m=n/2;
if(n%2==1) a[m+1][m+1]=n*n;
for(i=1;i<=m;i++)
{
s=n-2*i+1;
for(j=i;j<=n-i;j++)
{
a[j][i]=t+1-i+j;
a[n+1-i][j]=t+1-i+j+s;
a[j+1][n+1-i]=t+3*s-j+i;
a[i][j+1]=t+4*s-j+i;
}
t+=4*s;
}
}
void fun3(int (&a)[LEN][LEN],int n)
{
int i,j,m;
int s,t;
t=0;
m=n/2;
if(n%2==1) a[m+1][m+1]=n*n;
for(i=1;i<=m;i++)
{
s=n-2*i+1;
for(j=i;j<=n-i;j++)
{
if(i%2)
{
a[i][j]=t+1-i+j;
a[j][n+1-i]=t+1-i+j+s;
a[n+1-i][j+1]=t+3*s-j+i;
a[j+1][i]=t+4*s-j+i;
}
else
{a[j][i]=t+1-i+j;
a[n+1-i][j]=t+1-i+j+s;
a[j+1][n+1-i]=t+3*s-j+i;
a[i][j+1]=t+4*s-j+i;
}
}
t+=4*s;
}
}
void fun4(int (&a)[LEN][LEN],int n)
{
int i,j,m;
int s,t;
t=0;
m=n/2;
if(n%2==1) a[m+1][m+1]=n*n;
for(i=1;i<=m;i++)
{
s=n-2*i+1;
for(j=i;j<=n-i;j++)
{
if(i%2==0)
{
a[i][j]=t+1-i+j;
a[j][n+1-i]=t+1-i+j+s;
a[n+1-i][j+1]=t+3*s-j+i;
a[j+1][i]=t+4*s-j+i;
}
else
{a[j][i]=t+1-i+j;
a[n+1-i][j]=t+1-i+j+s;
a[j+1][n+1-i]=t+3*s-j+i;
a[i][j+1]=t+4*s-j+i;
}
}
t+=4*s;
}
}
int main(int argc, char *argv[])
{
int i,j,n,a[LEN][LEN];
int p; /////e用于标记选择操作
cout<<"1:顺转N阶方阵"<<endl
<<"2:逆转N阶方阵"<<endl
<<"3:顺逆转方阵"<<endl
<<"4:逆顺转方方阵"<<endl;
cout<<"请输入你的方阵选择:"<<endl;
cin>>p;
cout<<"输入你的方阵数N:"<<endl;
cin>>n;
switch (p)
{
case 1: fun1(a,n); cout<<"顺转N阶方阵"<<endl; break;
case 2: fun2(a,n);cout<<"顺转N阶方阵"<<endl; break;
case 3: fun3(a,n);cout<<"顺逆转N阶方阵"<<endl; break;
case 4: fun4(a,n);cout<<"逆顺转N阶方阵"<<endl; break;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
system("PAUSE");
return 0;
}
四种基本思路一致,只是因为时间关系,还没进行简洁改正,显得特别罗嗦,下次有时间再进行改正了。。
匆忙之间,还得去参加会议。
其中i 指的是方阵转的圈数,J表示对第I圈数的条边的N-2*I+1个元素操作。
顺转和逆转的操作只是将行列互换,
顺逆操作奇数圈操作同顺方阵。偶数圈同逆转方阵。。
逆顺操作同顺转操作行列互换。
#include <stdlib.h>
#define LEN 20
void fun1(int (&a)[LEN][LEN],int n)
{
int i,j,m;
int s,t;
t=0;
m=n/2;
if(n%2==1) a[m+1][m+1]=n*n;
for(i=1;i<=m;i++)
{
s=n-2*i+1;
for(j=i;j<=n-i;j++)
{
a[i][j]=t+1-i+j;
a[j][n+1-i]=t+1-i+j+s;
a[n+1-i][j+1]=t+3*s-j+i;
a[j+1][i]=t+4*s-j+i;
}
t+=4*s;
}
}
void fun2(int (&a)[LEN][LEN],int n)
{
int i,j,m;
int s,t;
t=0;
m=n/2;
if(n%2==1) a[m+1][m+1]=n*n;
for(i=1;i<=m;i++)
{
s=n-2*i+1;
for(j=i;j<=n-i;j++)
{
a[j][i]=t+1-i+j;
a[n+1-i][j]=t+1-i+j+s;
a[j+1][n+1-i]=t+3*s-j+i;
a[i][j+1]=t+4*s-j+i;
}
t+=4*s;
}
}
void fun3(int (&a)[LEN][LEN],int n)
{
int i,j,m;
int s,t;
t=0;
m=n/2;
if(n%2==1) a[m+1][m+1]=n*n;
for(i=1;i<=m;i++)
{
s=n-2*i+1;
for(j=i;j<=n-i;j++)
{
if(i%2)
{
a[i][j]=t+1-i+j;
a[j][n+1-i]=t+1-i+j+s;
a[n+1-i][j+1]=t+3*s-j+i;
a[j+1][i]=t+4*s-j+i;
}
else
{a[j][i]=t+1-i+j;
a[n+1-i][j]=t+1-i+j+s;
a[j+1][n+1-i]=t+3*s-j+i;
a[i][j+1]=t+4*s-j+i;
}
}
t+=4*s;
}
}
void fun4(int (&a)[LEN][LEN],int n)
{
int i,j,m;
int s,t;
t=0;
m=n/2;
if(n%2==1) a[m+1][m+1]=n*n;
for(i=1;i<=m;i++)
{
s=n-2*i+1;
for(j=i;j<=n-i;j++)
{
if(i%2==0)
{
a[i][j]=t+1-i+j;
a[j][n+1-i]=t+1-i+j+s;
a[n+1-i][j+1]=t+3*s-j+i;
a[j+1][i]=t+4*s-j+i;
}
else
{a[j][i]=t+1-i+j;
a[n+1-i][j]=t+1-i+j+s;
a[j+1][n+1-i]=t+3*s-j+i;
a[i][j+1]=t+4*s-j+i;
}
}
t+=4*s;
}
}
int main(int argc, char *argv[])
{
int i,j,n,a[LEN][LEN];
int p; /////e用于标记选择操作
cout<<"1:顺转N阶方阵"<<endl
<<"2:逆转N阶方阵"<<endl
<<"3:顺逆转方阵"<<endl
<<"4:逆顺转方方阵"<<endl;
cout<<"请输入你的方阵选择:"<<endl;
cin>>p;
cout<<"输入你的方阵数N:"<<endl;
cin>>n;
switch (p)
{
case 1: fun1(a,n); cout<<"顺转N阶方阵"<<endl; break;
case 2: fun2(a,n);cout<<"顺转N阶方阵"<<endl; break;
case 3: fun3(a,n);cout<<"顺逆转N阶方阵"<<endl; break;
case 4: fun4(a,n);cout<<"逆顺转N阶方阵"<<endl; break;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
system("PAUSE");
return 0;
}
四种基本思路一致,只是因为时间关系,还没进行简洁改正,显得特别罗嗦,下次有时间再进行改正了。。
匆忙之间,还得去参加会议。
其中i 指的是方阵转的圈数,J表示对第I圈数的条边的N-2*I+1个元素操作。
顺转和逆转的操作只是将行列互换,
顺逆操作奇数圈操作同顺方阵。偶数圈同逆转方阵。。
逆顺操作同顺转操作行列互换。
相关文章推荐
- 数字旋转方阵和上三角(递归问题)
- 视频录制与播放(竖屏)旋转90度问题
- [google面试CTCI] 1-6.图像旋转问题
- iOS关于拍照旋转90度的问题
- 用latex排版中的对象旋转问题
- 【LeetCode】Search in Rotated Sorted Array旋转数组问题总结
- 三星拍照旋转问题
- 集合的全排列问题-递归实现方式的改进---旋转法
- 对于Unity中旋转问题的一点总结
- MVP模式的Android 调用系统拍照,相册,剪裁,适配到7.0,修复拍照图片旋转问题
- 单个控制器的屏幕旋转问题
- 用Fragment解决屏幕旋转(状态发生变化)状态不能保持的问题
- HDU 5251 矩形面积(二维凸包旋转卡壳最小矩形覆盖问题) --2015百度之星题目
- 解决android有的手机拍照后上传图片被旋转的问题
- leetcode中的n*n数组旋转问题
- Android解决三星手机拍照图片调用时逆时针旋转90度问题
- 使用通知监听屏幕的旋转可以有效的避免viewcontrollor判断转向错误的问题
- iOS 5.1及6.0 屏幕旋转的兼容问题
- 解决android有的手机拍照后上传图片被旋转的问题
- android关于手机拍照图片旋转问题