这道题我一开始的想法是:把每个需要交换的都交换了,循环n次肯定就是结果,n又比较小不会超时。但是这种想法too young,因为它无法交换需要间接交换的两个数。

所以一种正确解法是:找出能间接交换的所有i和j,把对应的A[i][j]=A[j][i]='1',之后只需扫一遍整个矩阵把要换的换了就是最终结果啦。

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n , a[N] , A[N][N];
string s ;
int main()
{
    cin >> n;
    for( int i = 1 ; i <= n ; ++i ) cin >> a[i];
    for( int i = 1 ; i <= n ; ++i )
    {
        cin >> s ;
        for( int j = 0 ; j < n ; ++j )
        {
            if( s[j] == '1' ) A[i][j+1] = 1 ;
            else A[i][j+1] = 0 ;
        }
    }
    for( int i = 1 ; i <= n ; ++i )
    {
        for( int j = 1 ; j <= n ; ++j )
        {
            if( A[j][i] == 0 ) continue ;
            for( int k = 1 ; k <= n ; ++k )
            {
                if( A[i][k] ) A[j][k] = 1 ;
            }
        }
    }
    for( int i = 1 ; i <= n ; ++i )
    {
        for( int j = i + 1 ; j <= n ; ++j )
        {
            if( A[i][j] && a[i] > a[j] ) swap( a[i] , a[j] );
        }
    }
    for( int i = 1 ; i <= n ; ++i ) cout << a[i] << " ";
}
网上某大神的代码

相关文章: