包含多组测试数据,每组测试数据第一行为一个整数N,表示方阵的阶数. 接下来输入这个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
java里最快的,思路可以看看
package com.speical.first;
import java.util.Scanner;
/**
* 调整方阵
*
* 我们通过排序找到每一列最大数所在的行数即可
*
* 不必交换矩阵!!!!!
* @author Special
* @time 2018/02/07 23:30:58
*/
public class Pro197 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
while(input.hasNext()) {
int n = input.nextInt();
int[][] nums = new int[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
nums[i][j] = input.nextInt();
}
}
int[] indices = new int[n];
int max = 0;
boolean[] flag = new boolean[n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(!flag[j]) {
max = j;
break;
}
}
for(int j = 0; j < n; j++) {
if(!flag[j] && nums[j][i] > nums[max][i]) {
max = j;
}
}
indices[i] = max;
flag[max] = true;
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
System.out.print((j == 0 ? "" : " ") + nums[indices[i]][j]);
}
System.out.println();
}
}
}
}
#include <stdio.h> #define N 11//矩阵最大维度 void Exchange(int martix[N][N], int n, int a, int b) {//交换n维矩阵martix的a行和b行 int temp; if(a==b) return;//同一行就别交换了,浪费时间 for(int j=0; j<n; j++)//交换a、b两行 { temp=martix[a][j]; martix[a][j]=martix[b][j]; martix[b][j]=temp; } return; } int main() { int i, j, martix[N][N]; int n, max;//max为最大数所在的行 while(scanf("%d", &n)!=EOF) { if(n<1) break;//非法输入就退出 for(i=0; i<n; i++)//读取数组 { for(j=0; j<n; j++) scanf("%d", &martix[i][j]); } for(j=0; j<n; j++) { max=j;//先默认j行j列那个数在第j列最大 for(i=j; i<n; i++)//找到j列最大数的位置 { if(martix[i][j]>martix[max][j]) max=i; } Exchange(martix, n, j, max);//把最大数那一行和j行交换 } for(i=0; i<n; i++)//打印结果 { for(j=0; j<n; j++) { printf("%d", martix[i][j]); if(j!=n-1) printf(" ");//不是这一行最后一个元素,打印空格 else printf("\n");//这一行最后一个元素,打印换行符 } } } return 0;//大功告成 }
#include<iostream> using namespace std; #define max_len 11 int a[max_len][max_len]; void transfer(int a[max_len][max_len],int n,int i,int j) { for(int l = 0;l < n;l++) { int temp = a[i][l]; a[i][l] = a[j][l]; a[j][l] = temp; } } int main(void) { int n; int b[max_len]; while(cin >> n) { for(int i = 0;i < n;i++) for(int j = 0;j < n;j++) { int x; cin >> x; a[i][j] = x; } for(int i = 0;i < n;i++) { int max = i; for(int j = i;j < n;j++) { if(a[max][i] < a[j][i]) max = j;//本列中最大数所在行号 } transfer(a, n, i, max); } for(int i = 0;i < n;i++) { for(int j = 0;j < n;j++) cout << a[i][j] << ' '; cout << endl; } } return 0; }
#include <bits/stdc++.h> using namespace std; int arr[11][11]; int n; void change(int a,int b) { for(int i=0;i<n;++i) swap(arr[a][i],arr[b][i]); } int main() { while(cin>>n) { for(int i=0;i<n;++i) for(int j=0;j<n;++j) cin>>arr[i][j]; for(int i=0;i<n;++i) { int max=i; for(int j=i;j<n;++j) { if(arr[j][i]>arr[max][i]) max=j; } change(i,max); } for(int i=0;i<n;++i) { for(int j=0;j<n-1;++j) cout<<arr[i][j]<<" "; cout<<arr[i][n-1]<<endl; } } }
#include<stdio.h> int main() { int N,i,j,a[12][12],num=1,k,t; scanf("%d",&N); for(i=1;i<=N;i++)//输入 for(j=1;j<=N;j++) scanf("%d",&a[i][j]); for(j=1;j<=N;j++)//列 { int max=a[j][j],index=j;//默认最大的值 for(i=j;i<=N;i++) { if(a[i][j]>max)//找到最大数所在的行 { max=a[i][j];index=i;}//i这行这列的数最大 } for(k=1;k<=N;k++)//整行交换 { t=a[index][k]; a[index][k]=a[num][k]; a[num][k]=t; } num++;//交换行的下标从一开始 } for(i=1;i<=N;i++)//输出 { for(j=1;j<=N;j++) printf("%d ",a[i][j]); printf("\n"); } }
//总体复杂度为o(n*n) #include<iostream> using namespace std; int main(){ int n; while(cin>>n){ int **a=new int*[n]; for(int i=0;i<n;i++) a[i]=new int[n]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>a[i][j]; for(int i=0;i<n;i++){ int max=-999999,pos=0; for(int j=i;j<n;j++)//从第i行第i列开始遍历到第n-1行最后一列,更新最大值,记录最大值位置 if(a[j][i]>max){ max=a[j][i]; pos=j; } for(int j=0;j<n;j++){//交换含最大值的行和第i行 int temp=a[i][j]; a[i][j]=a[pos][j]; a[pos][j]=temp; } } for(int i=0;i<n;i++){//顺序输出所有值 for(int j=0;j<n-1;j++) cout<<a[i][j]<<" "; cout<<a[i][n-1]<<endl; } } }
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); while(input.hasNext()){ int n = input.nextInt(); int [][] a = new int [10][10]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) a[i][j]=input.nextInt(); int[] pos = new int[10]; for(int i=0;i<n;i++) pos[i]=i; for(int j=0;j<n;j++) { int max=a[pos[j]][j]; int t = j; for(int i=j+1;i<n;i++) { if(a[pos[i]][j]>max) { max =a[pos[i]][j]; t = i; } } int o = pos[j]; pos[j]=pos[t]; pos[t]=o; } for(int i=0;i<n;i++){ for(int j=0;j<n;j++) { if(j==n-1) System.out.print(a[pos[i]][j]); else System.out.print(a[pos[i]][j]+" "); } System.out.println(); } } input.close(); } }
//每行最后一个数字后面不要空格,直接换行,不然通过不了 import java.util.Scanner;
public class Main{ public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int a=sc.nextInt();
int[][] b=new int[a][a];
//建立一个二维数组
for(int i=0;i<b.length;i++){
for(int j=0;j<b.length;j++){
b[i][j]=sc.nextInt();
}
}
//开始循环列数,找出最大值
for(int lie=0;lie<b.length-1;lie++){
int row=lie;
int temp=0;
for(int i=lie;i<b.length;i++){
//找出该列的最大值
if(b[i][lie]>temp){
temp=b[i][lie];
row=i;
}
}
//开始交换行
for(int h=0;h<b.length;h++){
int temp1=0;
temp1=b[lie][h];
b[lie][h]=b[row][h];
b[row][h]=temp1;
}
}
//最后的输出
for(int i=0;i<b.length;i++){
for(int j=0;j<b.length;j++){
if(j==b.length-1)
System.out.println(b[i][j]);
else
System.out.print(b[i][j]+" ");
}
}
}
}
}
#include <bits/stdc++.h> using namespace std; int main() { int n; while(cin>>n) { vector<vector<int>> vec(n,vector<int>(n,0));//vec(n个,内容) for(int i=0;i<n;i++) for(int j=0;j<n;j++) { int a; cin>>vec[i][j]; } for(int j=0;j<n;j++) { int max=-INT_MAX,maxi; for(int i=j;i<n;i++) { if(vec[i][j]>max) { max=vec[i][j]; maxi=i; } } swap(vec[j],vec[maxi]);//体现了用vector构造二维数组的好处 } for(int i=0;i<n;i++) { for(int j=0;j<n-1;j++) { cout<<vec[i][j]<<" "; } cout<<vec[i][n-1]<<endl; } } return 0; }
//1、两行交换的函数 //2、找出对应列最大元素所在行的函数 #include<stdio.h> #include<string> using namespace std; int arr[100][100]; void switchRow(int n,int a,int b){ int tmp[n+1]; for(int i=1;i<=n;i++){ tmp[i] = arr[a][i]; arr[a][i] = arr[b][i]; } for(int i=1;i<=n;i++){ arr[b][i] = tmp[i]; } } int FindMaxIndex(int n,int line){ int index = line; for(int i=line;i<=n;i++){ if(arr[i][line]>arr[index][line]){ index = i; } } return index; } int main(){ int N; scanf("%d",&N); for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ scanf("%d",&arr[i][j]); } } for(int i=1;i<N;i++){ int indx = FindMaxIndex(N,i); switchRow(N,i,indx); } for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ printf("%d ",arr[i][j]); } printf("\n"); } }
#include <array> #include <climits> #include <iostream> using namespace std; const int MAXN = 11; array<array<int, MAXN>, MAXN>matrix; //方阵 //交换方阵的两行,row_num1和row_num2为行号,col_num为方阵列数 void swap_row(int row_num1, int row_num2, int col_num) { for (int i = 1; i <= col_num; i++) { swap(matrix[row_num1][i], matrix[row_num2][i]); } } int main() { int n; while (cin >> n) { //输入方阵 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> matrix[i][j]; } } //调整方阵 for (int j = 1; j <= n - 1; j++) { int max = INT_MIN, row; //最大数及其所在行号 for (int i = j; i <= n; i++) { if (max < matrix[i][j]) { max = matrix[i][j]; row = i; } } swap_row(j, row, n); //交换第j行与第row行 } //输出方阵 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cout << matrix[i][j] << " "; } cout << endl; } } return 0; }
#include <iostream> using namespace std; void swap(int a[], int b[], int n){ int temp[n]; for(int i=0;i<n;i++){ temp[i] = a[i]; a[i] = b[i]; b[i] = temp[i]; } } int main(){ int N; cin>>N; int arr[N][N]; for(int i=0;i<N;i++) for(int j=0;j<N;j++) cin>>arr[i][j]; for(int i=0;i<N;i++){ int max = i; for(int j=i+1;j<N;j++){ if(arr[j][i] > arr[max][i]) max = j; } swap(arr[i], arr[max],N); } for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ cout<<arr[i][j]<<' '; } cout<<endl; } }
#include <iostream> using namespace std; int main() { int n; while(cin>>n){ int a[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>a[i][j]; } } for(int i=0;i<n;i++){ int maxindex=i; for(int j=i;j<n;j++){ if(a[j][i]>a[maxindex][i]){ maxindex=j; } } //互换 int temp; for(int j=0;j<n;j++){ temp=a[i][j]; a[i][j]=a[maxindex][j]; a[maxindex][j]=temp; } } //输出 for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(j!=0){ cout<<" "; } cout<<a[i][j]; } cout<<endl; } } }
#include <bits/stdc++.h> using namespace std; int main(){ int n; while(cin>>n){ int number[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>number[i][j]; //输入 } } for(int i=0;i<n;i++){ vector<int>myvector; for(int j=i;j<n;j++){ myvector.push_back(number[j][i]); //把列元素存入vector } int max_pos=max_element(myvector.begin(),myvector.end())-myvector.begin()+i; //找到最大值下标,但别忘记要+i,因为vector的长度会变化 //第二次循环长度-1,与实际列中的下标位置不符合 for(int k=0;k<n;k++){//交换 int temp=number[max_pos][k]; number[max_pos][k]=number[i][k]; number[i][k]=temp; } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cout<<number[i][j]<<" "; } cout<<endl; } } return 0; }
#include<iostream> using namespace std; int main(){ int N; while(cin>>N){ int arr[N][N]; for(int i=0;i<N;i++) for(int j=0;j<N;j++) scanf("%d",&arr[i][j]); for(int j=0;j<N;j++){ int max=0,maxi=0; for(int i=j;i<N;i++) if(arr[i][j]>max){ max=arr[i][j]; maxi=i; } for(int k=0;k<N;k++) swap(arr[maxi][k],arr[j][k]); } int p=0; while(p<N){ for(int i=0;i<N;i++) printf("%d ",arr[p][i]); printf("\n"); p++; } } }
#include<iostream> #include<vector> #include<map> using namespace std; //找到每次最大值所在的行,范围choose至矩阵最后一行 int find(vector<vector<int> > num, int choose, int n){ map<int, int> mp; for(int i=choose; i<n; i++) mp[num[i][choose]]=i; return mp.rbegin()->second; } int main(){ int n, tmp; while(cin>>n){ vector<vector<int> > num(n); //输入 for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ cin>>tmp; num[i].push_back(tmp); } } for(int i=0; i<n; i++){ int index=find(num, i, n); swap(num[i], num[index]); } //输出 for(int i=0; i<n; i++){ for(int j=0; j<n; j++) cout<<num[i][j]<<' '; cout<<endl; } } return 0; }
#include<iostream> #include<string> #include<vector> #include<math.h> #include<algorithm> #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:4996) using namespace std; //按题目要求交换的函数,tar为含最大数的那一行,i为此时对应行 void swap(int tar, int i, vector<vector<int>> &vec) { for (int j = 0; j < vec.size(); j++) { int temp = vec[tar][j]; vec[tar][j] = vec[i][j]; vec[i][j] = temp; } } int main() { int n; while (scanf("%d", &n) != EOF) { vector< vector<int> > vec; for (int i = 0; i < n; i++) { vector<int> ivec; ivec.clear(); for (int j = 0; j < n; j++) { int num; cin >> num; ivec.push_back(num); } vec.push_back(ivec); } for (int j = 0; j < n; j++) { int max = vec[j][j]; int target = j; for (int i = j; i < n; i++) {//第i行 if (max < vec[i][j]) { max = vec[i][j]; target = i;//第一列中最大数所在行 } } swap(target, j, vec); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << vec[i][j] << " "; } cout << endl; } } return 0; }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextInt()) { int n = sc.nextInt(); int arr[][] = new int[n][n]; for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ arr[i][j] = sc.nextInt(); } } reverArr(arr, n); show(arr, n); } sc.close(); } //交换数组的第x行和第y行 static void rever(int[][] arr, int n, int x, int y){ for (int i = 0; i < n; i++){ int tem = arr[x][i]; arr[x][i] = arr[y][i]; arr[y][i] = tem; } } //找到最大行,交换 static void reverArr(int[][] arr, int n){ for (int i = 0; i < n-1; i++){ int MaxI = i; for (int j = i; j < n; j++){ if (arr[j][i] > arr[MaxI][i]){ MaxI = j; } } rever(arr, n, i, MaxI); } } //打印数组 static void show(int[][] arr, int n){ for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ System.out.print(arr[i][j] + " "); } System.out.println(); } } }
#include<cstdio> (802)#include<vector> #include<algorithm> using namespace std; int main(){ int n; while(scanf("%d",&n)!=EOF){ vector<vector<int> > v(n,vector<int>(n)); for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ scanf("%d",&v[i][j]); } } for(int j=0;j<n-1;++j){ int k=j; for(int i=j+1;i<n;++i){ if(v[i][j]>v[k][j]) k=i; } for(int i=0;i<n;++i){ swap(v[j][i],v[k][i]); } } for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ if(j==0) printf("%d",v[i][j]); else printf(" %d",v[i][j]); } printf("\n"); } } return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 11 int matrix[N][N]; void exchange(int, int, int); int main() { int n; while(~scanf("%d", &n)) { memset(matrix, 0, sizeof(matrix)); int i, j; for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) scanf("%d", &(matrix[i][j])); int loop = 1; while(loop != n) { int max_loc = loop; for(i = loop; i <= n; i++) if(matrix[i][loop] > matrix[max_loc][loop]) max_loc = i; if(max_loc != loop) exchange(max_loc, loop, n);//交换两行 loop++; } for(i = 1; i <= n; i++) { printf("%d", matrix[i][1]); for(j = 2; j <= n; j++) printf(" %d", matrix[i][j]); putchar(10); } } return 0; } void exchange(int i, int j, int n) { for(int k = 1; k <= n; k++) { int temp = matrix[i][k]; matrix[i][k] = matrix[j][k]; matrix[j][k] = temp ; } }