2362: 密码锁
时间限制: 2 秒 内存限制: 30 MB提交: 199 解决: 49
题目描述
LLM偶然得到了一个3*3的密码锁,现在他要破译这个锁。他每次可以选择任意行列进行一次旋转,旋转效果示例如下:
3 2 1 进行一次旋转可以变成 1 3 2或者 2 1 3
现在给你一个初始状态,问你至少可以旋转几次到达
123
456
789
状态
如果旋转五次都无法到达,输出“impossible”;
输入
每个测试文件少于十组测试样例
每个测试样例包含一个字符串代表这个3*3的初始矩阵
每个测试样例包含一个字符串代表这个3*3的初始矩阵
输出
输出包含一行,代表答案
样例输入
123456789
样例输出
0
提示
来源
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int f;
bool pd(int s[][3])
{
if(s[0][0]!=1)return 0;
if(s[0][1]!=2)return 0;
if(s[0][2]!=3)return 0;
if(s[1][0]!=4)return 0;
if(s[1][1]!=5)return 0;
if(s[1][2]!=6)return 0;
if(s[2][0]!=7)return 0;
if(s[2][1]!=8)return 0;
if(s[2][2]!=9)return 0;
return 1;
}
void dfs(int step,int s[][3])
{
if(pd(s))
{
if(f>step || f==0)
f=step;
return ;
}
if(step>5)
return ;
for(int i=0;i<3;i++)
{
int p[3][3];
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
{
p[j][k]=s[j][k];
}
int a=p[i][0],b=p[i][1],c=p[i][2];
p[i][0]=b; p[i][1]=c; p[i][2]=a;
dfs(step+1,p);
p[i][0]=a; p[i][1]=b; p[i][2]=c;
p[i][0]=c; p[i][1]=a; p[i][2]=b;
dfs(step+1,p);
p[i][0]=a; p[i][1]=b; p[i][2]=c;
}
for(int i=0;i<3;i++)
{
int p[3][3];
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
{
p[j][k]=s[j][k];
}
int a=p[0][i],b=p[1][i],c=p[2][i];
p[0][i]=b; p[1][i]=c; p[2][i]=a;
dfs(step+1,p);
p[0][i]=a; p[1][i]=b; p[2][i]=c;
p[0][i]=c; p[1][i]=a; p[2][i]=b;
dfs(step+1,p);
p[0][i]=a; p[1][i]=b; p[2][i]=c;
}
}
int main()
{
char ss[15];
int s[3][3];
while(~scanf("%s",ss))
{
f=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
s[i][j]=ss[f++]-'0';
}
}
f=0;
dfs(1,s);
if(f)printf("%d\n",f-1);
else printf("impossible\n");
}
return 0;
}