我的想法是遍历 l 为当前比较行和列的第 l 个数,k 表示当前比较第 k 行和第 k 列,然后按照大小关系进行贪心交换。如果交换过就打标记,但是不知道为什么一直都是错的。
求大佬分享一下思路/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");
}
}
}