日期:2014-05-20  浏览次数:20810 次

矩阵旋转的问题
代码是这样的:
/**
 * 
 */

/**
 * @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
怎么回事啊

------解决方案--------------------
矩阵行转列应该是按对角线来交换的,像你这样交换,第一次循环交换以后,元素顺序就变了,也就是说第二行的后一个元素就不再是原来的元素了,所以第二次循环交换的时候就有差别了

for example
Java code
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]));
}

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