Div 2 E
  • 板块学术版
  • 楼主Resolute_Faith
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/8/7 00:42
  • 上次更新2023/10/27 16:40:35
查看原帖
Div 2 E
754746
Resolute_Faith楼主2022/8/7 00:42

我的想法是遍历 ll 为当前比较行和列的第 ll 个数,kk 表示当前比较第 kk 行和第 kk 列,然后按照大小关系进行贪心交换。如果交换过就打标记,但是不知道为什么一直都是错的。

求大佬分享一下思路/kk

//CF E
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int T,n,a[N][N],vis[N];
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(register int i=1;i<=n;i++){
            vis[i]=false;
            for(register int j=1;j<=n;j++){
                scanf("%d",&a[i][j]);
            }
        }
        for(register int l=1;l<=n;l++){
            int p=0;
            for(register int k=1;k<=n;k++){
                int x=1,y=1;
                if(l<=k){
                    if(a[k][l]<a[l][k]&&!vis[k]){
                        p=k;
                        while(1){
                            if(x==n+1) break;
                            swap(a[k][x],a[y][k]);
                            x++,y++;
                        }
                        vis[k]=true;
                    }
                }else{
                    if(a[l][k]<a[k][l]&&!vis[k]){
                        p=k;
                        while(1){
                            if(x==n+1) break;
                            swap(a[k][x],a[y][k]);
                            x++,y++;
                        }
                        vis[k]=true;
                    }
                }
            }
            for(register int i=1;i<=n;i++){
                if(l<=i){
                    if(a[l][i]<a[i][l]) vis[i]=true;
                }else{
                    if(a[i][l]<a[l][i]) vis[i]=true;
                }
            }
        }
        for(register int i=1;i<=n;i++){
            for(register int j=1;j<=n;j++){
                printf("%d ",a[i][j]);
            }
            printf("\n");
        }
    }
}
2022/8/7 00:42
加载中...