问题:输入一个N(N<=10)阶方阵,按照如下方式调整方阵:
1.将第一列中最大数所在的行与第一行对调。
2.将第二列中从第二行到第N行最大数所在的行与第二行对调。
…
N-1.将第N-1列中从第N-1行到第N行最大数所在的行与第N-1行对调。
N.输出这个方阵
样例输入:
4
3 6 8 7
6 7 5 3
8 6 5 3
9 8 7 2
样例输出:
9 8 7 2
6 7 5 3
3 6 8 7
8 6 5 3
解题思路:等以后有时间再写
解决代码:
#include<stdio.h>
#include<stdlib.h>
int main(){
int n,*p;
scanf("%d",&n);
//C语言只接受常量作为数组下标,只能通过动态创建空间来模拟二维数组
p=(int *)malloc(sizeof(int)*n*n); //创建二维数组内存空间
for(int i=0;i<n;i++){ //按行输入数组元素
for(int j=0;j<n;j++)
scanf("%d",p+n*i+j); //A[i][j]==*(p+n*i+j)
}
//对矩阵进行处理
for(int i=0;i<n;i++){
int max=i; //将该列最大数的所在行数记录到max里面
for(int j=i;j<n;j++){ //因为第一行对调后放置不管
if(*(p+n*j+i)>*(p+n*max+i)){//所以j=i,来跳过已经对调过的处于上层的行
max=j;
}
}
int tmp;
for(int j=0;j<n;j++){ //将第i列中从第i行到第n行最大数所在的行与第max(i<=max<=n)行对调
tmp=*(p+n*max+j);
*(p+n*max+j)=*(p+n*i+j);
*(p+n*i+j)=tmp;
}
}
for(int i=0;i<n;i++){ //按行输入数组元素
for(int j=0;j<n;j++){
printf("%d ",*(p+n*i+j)); //A[i][j]==*(p+n*i+j)
}
printf("\n");
}
}
运行结果: