本題有個坑,就是輸出的交換次數不一定是樣例給出的,只要交換次數小於總的個數就可以了~~~~
所以這道題就邊的簡單了,只要按從左到右、從上到下的順序從1—s就可以了。
思路是:輸入時,用p[N*N],q[N*N]記錄每個數所在位置的下標,即i,j,然後用x[N*N],y[N*N]記錄交換的第一個數的下標,用u[N*N],v[N*n]記錄交換的第二個數的下標,
接下來實現交換就可以了。代碼如下~~
#include <iostream>#include <stdio.h>
#include <cmath>
#define N 55
using namespace std;
int a[N],m[N][N],x[N*N],y[N*N],u[N*N],v[N*N],p[N*N],q[N*N];
int main()
{
int n,i,j,s,g=0;
cin >> n;
for(i=0;i<n;i++)
cin >> a[i];
for(i=0;i<n;i++)
for(j=0;j<a[i];j++)
{
cin >> m[i][j];
p[m[i][j]]=i;
q[m[i][j]]=j;
}
for(s=0,i=0;i<n;i++)
for(j=0;j<a[i];j++)
{
s++;
if(s!=m[i][j])
{
x[g]=i+1;
y[g]=j+1;
u[g]=p[s]+1;
v[g]=q[s]+1;
m[p[s]][q[s]]=m[i][j];
p[m[i][j]]=p[s];
q[m[i][j]]=q[s];
g++;
}
}
cout << g <<endl;
for(i=0;i<g;i++)
{
cout << x[i] << " " << y[i] << " " << u[i] << " " << v[i] << endl;
}
return 0;
}