现在的位置: 首页 > 综合 > 正文

旋转方阵问题

2013年07月07日 ⁄ 综合 ⁄ 共 2288字 ⁄ 字号 评论关闭

#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个元素操作。

顺转和逆转的操作只是将行列互换,

顺逆操作奇数圈操作同顺方阵。偶数圈同逆转方阵。。

逆顺操作同顺转操作行列互换。

抱歉!评论已关闭.