首先对于这道题,感觉就是暴搜。
我们可以发现,第二种情况是优于第一种情况的,因为假设我某些点最终是需要第一种操作来变换过去,那么早换晚换都是一样的,因为第一种操作可以将任何一个数字变化另外的任何一个数字。
既然如此,那么我们就可以通过枚举第二种情况然后看看还剩下有多少个数字不同然后再加上去就好了。
那么最重要的就是枚举了
那么对于1 2 3 4 5 6(代表原来是1的现在为1,原来是2的现在为2.。。)
是如何变成2 2 3 4 5 6(代表原来是1的现在为1,原来是2的现在为2.。。)
很简单,1变成2就可以了。那不是用一次广搜就搞定初始化了。
初始化搞定了,剩下的一切就都简单了,代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define N 7
struct NODE
{
int x[6];
int val;
void build(int a,int b,int c,int d,int f,int g)
{
x[0]=a;x[1]=b;x[2]=c;x[3]=d;x[4]=f;x[5]=g;
}
void change(int a,int b)
{
for(int i=0;i<6;i++)
{
if(x[i]==a)
x[i]=b;
}
}
};
vector<NODE>v;
bool vis[N][N][N][N][N][N];
int a[N][N];
void bfs()
{
queue<NODE>q;
NODE now,next;
memset(vis,0,sizeof(vis));
now.build(1,2,3,4,5,6);now.val=0;
vis[1][2][3][4][5][6]=1;
q.push(now);
while(!q.empty())
{
now=q.front();q.pop();
v.push_back(now);
int i,j;
for(i=1;i<=6;i++)
for(j=1;j<=6;j++)
{
if(i==j)
continue;
next=now;next.val+=1;
next.change(i,j);
if(!vis[next.x[0]][next.x[1]][next.x[2]][next.x[3]][next.x[4]][next.x[5]])
{
vis[next.x[0]][next.x[1]][next.x[2]][next.x[3]][next.x[4]][next.x[5]]=1;
q.push(next);
}
}
}
}
char s[100010],s1[100010];
int main()
{
bfs();
int m=v.size();
int len,i,j,k;
int ans,res;
NODE now;
// freopen("in.txt","r",stdin);
while(scanf("%s%s",s,s1)!=EOF)
{
memset(a,0,sizeof(a));
len=strlen(s);ans=len;
for(i=0;i<len;i++)
{
a[s1[i]-'0'][s[i]-'0']++;
}
for(i=0;i<m;i++)
{
now=v[i];res=now.val;
for(j=0;j<6;j++)
{
for(k=1;k<=6;k++)
{
if(a[j+1][k]&&now.x[j]!=k)
res+=a[j+1][k];
}
}
ans=min(res,ans);
}
printf("%d\n",ans);
}
return 0;
}