7月12日B題:Young Table

本題有個坑,就是輸出的交換次數不一定是樣例給出的,只要交換次數小於總的個數就可以了~~~~

所以這道題就邊的簡單了,只要按從左到右、從上到下的順序從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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章