密碼游戲(password.cpp)


密碼游戲 (password.cpp/c/pas)

【問題描述】

YJC 很喜歡玩游戲,今天他決定和朋友們玩密碼游戲。 密碼游戲的規則是這樣的:初始時有兩個大小為 m 的數組 a 和 b,分別是 0~m-1 的一 個排列。每一次操作在 0~m-1 之間選一個數 x,求出結果 y=b[a[x]],把 x 和 y 寫下來。之 后,a 數組向前循環移動一次,即(a[0],a[1],...,a[m-2],a[m-1])變成(a[1],a[2],...,a[m-1],a[0])。 當 a 數組變回初始狀態時,b 數組向前循環移動一次。現在知道所有的 x 和 y,如果 YJC 能 求出任意一組符合條件的 a 和 b 的初值,YJC 就贏了。 YJC 很想贏得游戲,但他太笨了,他想讓你幫他算出 a 和 b 的初值。

【輸入格式】

第一行包含兩個整數 n 和 m,表示操作了多少次和 a、b 數組的大小。 第二行包含 n 個整數,第 i 個數表示第 i 次選出的 x。 第二行包含 n 個整數,第 i 個數表示第 i 次求出的 y。

【輸出格式】

第一行包含 m 個整數,表示 a 的初值。 第二行包含 m 個整數,表示 b 的初值。如果有多組答案,輸出任意一組即可。

【輸入輸出樣例】

輸入

4   2

0   0   0   0

0   1   1   0

輸出

0   1

0   1

【數據說明】

對於 30%的數據,滿足 m≤5,n≤1000。

對於 100%的數據,滿足 2≤m≤26,m2≤n≤100000,保證數據隨機,且存在至少一組 a 和 b。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[30],b[30];
bool aa[30],bb[30];
int n,m,cnt,dx,dy;
int head[50];
int x[100005],y[100005];
bool key;
int re[30][30];
long long read(){
    long long a=0,b=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        ch=getchar();
    }
    if(ch=='-'){
        b=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        a=a*10+ch-'0';
        ch=getchar();
    }
    return a*b;
}
void Print_res(){
    for (int i=0;i<m;i++){
        printf("%d ",a[i]);
    }
    printf("\n");
    for (int i=0;i<m;i++){
        printf("%d ",b[i]);
    }
}
void dfs(int t){
    if(t==m){
        Print_res();
        key=1;
        return;
    }
    for(int k=0;k<m;k++){
        if(aa[k]){
            continue;
        }
        a[t]=k;
        bool ok=1;
        bool temp[30]={0};
        for(int e=0;e<m;e++){
            if(re[t][e]==-1){
                continue;
            }
            int v=(a[t]+e)%m;
            int val=re[t][e];
            if((b[v]==-1&&bb[val]==0)||b[v]==val);
            else{
                ok=0;
                break;
            }
        }
        if(ok==0){
            continue;
        }
        aa[k]=1;
        for (int e=0;e<m;e++){
            if(re[t][e]==-1){
                continue;
            }
            int v=(a[t]+e)%m;
            int val=re[t][e];
            if(b[v]==-1){
                b[v]=val;
                bb[val]=1;
                temp[v]=1;
            }
        }
        dfs(t+1);
        if(key){
            return;
        }
        for (int i=0;i<m;i++){
            if (temp[i]){
                bb[b[i]]=0;
                b[i]=-1;
            }
        }
        aa[k]=0;
    }
}
int main(){
    freopen("password.in","r",stdin);
    freopen("password.out","w",stdout);
    n=read(),m=read();
    for(int i=1;i<=n;i++){
        x[i]=read();
    }
    for(int i=1;i<=n;i++){
        y[i]=read();
    }
    for(int i=0;i<m;i++){
        a[i]=b[i]=-1;
    }
    memset(re,-1,sizeof(re));
    while(cnt<n){
        cnt++;
        re[(x[cnt]+dx)%m][dy]=y[cnt];
        dx++;
        if(dx==m){
            dx=0,dy++;
        }
        if(dy==m){
            dy=0;
        }
    }
    dfs(0);
    return 0;
}

 

解題思路:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM