首页 > 试题广场 >

调整方阵

[编程题]调整方阵
  • 热度指数:3252 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入一个N(N<=10)阶方阵,按照如下方式调整方阵: 1.将第一列中最大数所在的行与第一行对调。 2.将第二列中从第二行到第N行最大数所在的行与第二行对调。 依此类推... N-1.将第N-1列中从第N-1行到第N行最大数所在的行与第N-1行对调。 N.输出这个方阵

输入描述:
包含多组测试数据,每组测试数据第一行为一个整数N,表示方阵的阶数.
接下来输入这个N阶方阵.


输出描述:
调整后的方阵
示例1

输入

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();
            }
        }
    }

}
发表于 2018-02-08 11:09:46 回复(0)
简单注释了一下,凑合看
#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;//大功告成
}

发表于 2018-02-07 16:29:41 回复(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;
}

发表于 2021-02-23 18:18:25 回复(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;
        }    
    }
}


发表于 2021-02-02 19:15:05 回复(0)
#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");
    }
}

编辑于 2020-04-07 15:59:29 回复(0)
//总体复杂度为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;
        }
    }
}

发表于 2020-01-14 15:45:15 回复(0)
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();
    }
}

发表于 2017-04-02 13:31:12 回复(0)

//每行最后一个数字后面不要空格,直接换行,不然通过不了 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]+" ");
             }

         }
     }
 }

}

发表于 2017-04-14 11:13:52 回复(1)
#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;
}

编辑于 2024-03-22 12:04:21 回复(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");
    }
}


编辑于 2024-03-18 19:51:15 回复(0)
#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;
}

编辑于 2024-03-10 17:20:23 回复(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;
        }
}

发表于 2023-10-15 11:12:20 回复(0)
#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;
        }
    }
}

发表于 2023-03-28 10:07:26 回复(0)
#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;
}

发表于 2023-02-07 09:59:31 回复(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++;
        }
    }
}

发表于 2021-03-22 21:01:30 回复(0)
#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;
}

发表于 2021-03-14 14:14:01 回复(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;
}
发表于 2021-01-28 11:58:55 回复(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();
        }
    }
}
发表于 2020-05-12 09:27:55 回复(0)
#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;
}

发表于 2020-04-25 15:54:56 回复(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        ;
    }
}

编辑于 2020-04-22 16:05:22 回复(0)