代码是这样的:
/**
 * 
 *//**
 * @author Administrator
 *
 */
public class 矩阵旋转 { /**
 * @param args
 */
public static void main(String[] args) {
 int[][] a={{1,2,3,4},
                 {5,6,7,8},
                 {9,10,11,12},
                 {13,14,15,16},};

 for(int   i=0;i <4;i++){ 
 for(int   j=0;j <4;j++){ 
 System.out.print(a[i][j]+ "\t "); 
 } 
 System.out.print( "\n"); 
 }
 System.out.println( );
 int temp;
 for( int i=0;i<4;i++)
  for( int j=0;j<4;j++)
   {
   temp=a[i][j];
   a[i][j]=a[j][3-i];
   a[j][3-i]=temp;
   }
 for(int   i=0;i <4;i++){ 
 for(int   j=0;j <4;j++){ 
 System.out.print(a[i][j]+ "\t "); 
 } 
 System.out.print( "\n"); 
 }  
 }   
}
我要的结果应该是这样:
13 9 5 1 
14 10 6 2
15 11 7 3
16 12 8 4
但运行出来的结果是这样:
13 9 5 16
3 10 11 15
2 6 7 14
1 12 8 4
怎么回事啊

解决方案 »

  1.   

    矩阵行转列应该是按对角线来交换的,像你这样交换,第一次循环交换以后,元素顺序就变了,也就是说第二行的后一个元素就不再是原来的元素了,所以第二次循环交换的时候就有差别了for example
    int[][] a={{1,2,3,4},
      {5,6,7,8},
      {9,10,11,12},
      {13,14,15,16},};int tmp;
    for (int i=0; i<4; i++) { //行转列,按对角线交换
        for (int j=i; j<4; j++) {
            tmp = a[i][j];
            a[i][j] = a[j][i];
            a[j][i] = tmp;
        }
    }for (int i=0; i<2; i++) { //然后再按列平移
        for (int j=0; j<4; j++) {
            tmp = a[j][i];
            a[j][i] = a[j][3-i];
            a[j][3-i] = tmp; 
        }
    }for (int i=0; i<4; i++) {
        System.out.println(Arrays.toString(a[i]));
    }
      

  2.   

    因为旋转是在同一个数组中进行,你进行了重复的交换。
    比如第一次遍历:1和4换,2和8换,3和12换,但此时a[0][3]=1,所以1又和16交换。
    重复交换后的值为你得出的结果。
    而且在同一个数组中操作,你的行列值必须相同,没什么意义。
    如果你确实想交换的话,可以定义一个4乘4 boolean数组,记录已经交换过的值,以后不再交换就可得出你想要的结果。