题目
每次把空列换到最后一列,把非空行换到最下一行。
#include<cstdio> #include<algorithm> #define N 1005 using namespace std; struct ans{int i,a,b;} a[100005]; int n,m,x,y,ma[N][N],r[N],c[N]; int main() { scanf("%d",&n); for(int i=1; i<n; i++) { scanf("%d%d",&x,&y); ma[x][y]=1; r[x]++; c[y]++; } for(; n; n--) { for(int i=1; i<n; i++) if(c[i]==0) { a[m++]=(ans){2,n,i}; for(int j=1; j<=n; j++) swap(ma[j][n],ma[j][i]); swap(c[i],c[n]); break; } for(int i=1; i<n; i++) if(r[i]) { a[m++]=(ans){1,n,i}; swap(ma[n],ma[i]); swap(r[i],r[n]); break; } for(int i=1; i<=n; i++) if(ma[n][i])c[i]--; } printf("%d\n",m); for(int i=0; i<m; i++) printf("%d %d %d\n",a[i].i,a[i].a,a[i].b); }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆