码迷,mamicode.com
首页 > 其他好文 > 详细

密码游戏

时间:2019-11-06 16:46:19      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:个数   name   移动   结果   strong   png   描述   现在   多少   

密码游戏 (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;
}

 

技术图片

技术图片

解题思路:

技术图片

技术图片

密码游戏

标签:个数   name   移动   结果   strong   png   描述   现在   多少   

原文地址:https://www.cnblogs.com/xiongchongwen/p/11806070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!