オリジナルリンクwww.cnblogs.com/zhouzhendong/p/CF1172D.html
序文
ドミンゴの妖精は、CF本当にクールな方法を果たしています。45分後に再生していないDをカット?
私は、Dバースト肝斑が間違った方向、自閉症をしないだろうと思います。
問題の解決策
インクリメンタルなアプローチの構築を考えてみましょう。
我々はそれが必要な最初の行の行とタスクを完了するための最初の行と列に到達する必要性に到達すること、1行1列目で動作するように持っているものを検討してください。
設定\(R&LT [X] = 1、C [Y] = 1 \)。
場合は\(= Y-X-1 = \) 、そして私たちは、1行1列に任意のポータルを配置する必要はありません。
そうでなければ、我々は位置があり、一組のポータルを置く((1、Y)、(X、1)\)\我々は最初の伝送線路と、最初の列を完了できるように、。
最初の行は、Xに最初の行に到達したので、次に、我々は作る\(R&LT '[X] = R&LT [を1] \) 、共感の\(C' [Y] = Cの[1] \) 。
次に行う\(N「= N - 1 \)をプログラムするように構成されています。
場合、最終的な\(N = 1 \) 、構造は、構造の端部を完了する。
時間複雑\(O(^ N-2)\) 。
コード
#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof x)
#define For(i,a,b) for (int i=(a);i<=(b);i++)
#define Fod(i,b,a) for (int i=(b);i>=(a);i--)
#define fi first
#define se second
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define outval(x) cerr<<#x" = "<<x<<endl
#define outtag(x) cerr<<"---------------"#x"---------------"<<endl
#define outarr(a,L,R) cerr<<#a"["<<L<<".."<<R<<"] = ";\
For(_x,L,R)cerr<<a[_x]<<" ";cerr<<endl;
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef vector <int> vi;
LL read(){
LL x=0,f=0;
char ch=getchar();
while (!isdigit(ch))
f|=ch=='-',ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int N=1005;
int n;
int r[N],c[N];
pair <int,int> p1[N],p2[N];
int cnt=0;
int main(){
n=read();
For(i,1,n)
r[i]=read();
For(i,1,n)
c[i]=read();
For(i,1,n-1){
int pr,pc;
For(j,1,n){
if (r[j]==i)
pr=j;
if (c[j]==i)
pc=j;
}
if (pr==i&&pc==i)
continue;
cnt++;
p1[cnt]=mp(i,pc),swap(c[i],c[pc]);
p2[cnt]=mp(pr,i),swap(r[i],r[pr]);
}
printf("%d\n",cnt);
For(i,1,cnt)
printf("%d %d %d %d\n",p1[i].fi,p1[i].se,p2[i].fi,p2[i].se);
return 0;
}