密码游戏(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();
}
leave的用法
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);
return0;三层实木
}
解题思路: