这道题我一开始的想法是:把每个需要交换的都交换了,循环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] << " "; }