Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <string>
- #include <algorithm>
- #include <set>
- #include <map>
- #include <cmath>
- #include <cstring>
- #include <ctime>
- #include <unordered_map>
- #include <iomanip>
- #include <complex>
- #include <cassert>
- #include <queue>
- #include <random>
- #include <chrono>
- using namespace std;
- #define fi first
- #define se second
- #define pb push_back
- #define all(v) (v).begin(),(v).end()
- #define deb(a) cerr<< #a << "= " << (a)<<"\n";
- typedef long long ll;
- typedef unsigned long long ull;
- typedef unsigned int uint;
- typedef long double ld;
- typedef complex<double> base;
- typedef vector<int> vi;
- typedef pair<int,int> pii;
- template<class T> ostream& operator<<(ostream& stream, const vector<T> v){ stream << "[ "; for (int i=0; i<(int)v.size(); i++) stream << v[i] << " "; stream << "]"; return stream; }
- ll fpow(ll x, ll p, ll m){ll r=1; for (;p;p>>=1){ if (p&1) r=r*x%m; x=x*x%m; } return r;}
- ll inv(ll a, ll b){ return a<2 ? a : ((a-inv(b%a,a))*b+1)/a%b; }
- int gcd(int a, int b){ if (!b) return a; return gcd(b,a%b);}
- ll gcd(ll a, ll b){ if (!b) return a; return gcd(b,a%b);}
- int N,a[520][520];
- typedef vector<vi> matrix;
- vector<matrix> get_r(matrix a){
- matrix b(a);
- vector<matrix> ans;
- int i,j,k;
- for (i=0; i<N; i++)
- for (j=0; j<N; j++)
- b[i][j]=a[i][j]%N;
- bool all_p=1;
- for (j=0; j<N; j++)
- for (i=0; i<N; i++)
- all_p&=b[i][j]==j;
- if (!all_p){
- bool all_d=1;
- for (i=0; i<N; i++){
- vector<int> arr = b[i];
- sort(all(arr));
- for (j=0; j<N; j++)
- all_d&=arr[j]==j;
- }
- matrix cr=a;
- matrix bcopy=b;
- if (!all_d){
- vector<vector<bool>> v(N,vector<bool>(N));
- for (j=0; j<N; j++){
- for (i=0; i<N; i++){
- for (k=0; k<N; k++){
- if (!v[k][b[i][j]]){
- cr[k][j]=a[i][j];
- v[k][b[i][j]]=1;
- bcopy[k][j]=b[i][j];
- break;
- }
- }
- }
- }
- ans.pb(cr);
- }
- b=bcopy;
- matrix cr_copy=cr;
- for (i=0; i<N; i++){
- for (j=0; j<N; j++){
- cr[i][b[i][j]]=cr_copy[i][j];
- }
- }
- ans.pb(cr);
- }
- int K=0;
- for (i=0; i<N; i++)
- for (j=0; j<N; j++)
- a[i][j]=K++;
- ans.pb(a);
- return ans;
- }
- int main(){
- ios::sync_with_stdio(0);
- cin.tie(0);
- int T;
- cin >> T;
- while (T--){
- int i,j;
- cin >> N;
- for (i=1; i<=N; i++){
- for (j=1; j<=N; j++){
- cin >> a[i][j];
- }
- }
- bool ok=1;
- int K=0;
- for (i=1; i<=N; i++)
- for (j=1; j<=N; j++)
- ok&=a[i][j]==++K;
- if (ok){
- cout << 0 << "\n";
- continue;
- }
- matrix m(N,vi(N));
- for (i=0; i<N; i++)
- for (j=0; j<N; j++)
- m[i][j]=a[i+1][j+1]-1;
- vector<matrix> f=get_r(m);
- /*for (i=0; i<N; i++)
- for (j=i+1; j<N; j++)
- swap(m[i][j],m[j][i]);
- for (i=0; i<N; i++)
- for (j=0; j<N; j++){
- m[i][j]=(m[i][j]%N)*N+m[i][j]/N;
- }
- vector<matrix> s=get_r(m);
- for (matrix m : s){
- for (i=0; i<N; i++)
- for (j=i+1; j<N; j++)
- swap(m[i][j],m[j][i]);
- for (i=0; i<N; i++)
- for (j=0; j<N; j++){
- m[i][j]=(m[i][j]%N)*N+m[i][j]/N;
- }
- }
- vector<matrix> ans;
- if (f.size()<s.size()) ans=f;
- else ans=s;*/
- vector<matrix> ans=f;
- cout << "ans: " << ans.size() << "\n";
- for (matrix m : ans){
- for (i=0; i<N; i++,cout << "\n")
- for (j=0; j<N; j++)
- cout << m[i][j]+1 << " ";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement