2 1234 2144 1111 9999
2 4
题目大意:
把上边的串用最少的操作变成下边的串.
操作一共分三类,11种操作:
zifuchuan change(zifuchuan a,int b) { a.step++; if (b<4) // + { if(a.num[b]==9)a.num[b]=1; else a.num[b]++; } else if (b < 8) // - { if (a.num[b%4]==1)a.num[b%4]=9; else a.num[b%4]=a.num[b%4]-1; } else // swap { int tmp; b%=4; tmp=a.num[b]; a.num[b]=a.num[b+1]; a.num[b+1]=tmp; } return a; }
struct zifuchuan { int num[4];//四个数字 int step; }now,nex; int vis[10][10][10][10];//每个数字的变换记录.
#include<stdio.h> #include<queue> #include<string.h> using namespace std; struct zifuchuan { int num[4]; int step; }now,nex; int vis[10][10][10][10]; int mubiao[4]; char s1[5]; char s2[5]; zifuchuan change(zifuchuan a,int b) { a.step++; if (b<4) // + { if(a.num[b]==9)a.num[b]=1; else a.num[b]++; } else if (b < 8) // - { if (a.num[b%4]==1)a.num[b%4]=9; else a.num[b%4]=a.num[b%4]-1; } else // 换 { int tmp; b%=4; tmp=a.num[b]; a.num[b]=a.num[b+1]; a.num[b+1]=tmp; } return a; } void bfs() { queue<zifuchuan>s; memset(mubiao,0,sizeof(mubiao)); memset(vis,0,sizeof(vis)); for(int i=0;i<4;i++) { now.num[i]=s1[i]-'0'; mubiao[i]=s2[i]-'0'; } now.step=0; vis[now.num[0]][now.num[1]][now.num[2]][now.num[3]]=1; s.push(now); while(!s.empty()) { now=s.front(); if(now.num[0]==mubiao[0]&&now.num[1]==mubiao[1]&&now.num[2]==mubiao[2]&&now.num[3]==mubiao[3]) { printf("%d\n",now.step); return ; } s.pop(); for(int i=0;i<11;i++) { nex=change(now,i); if(vis[nex.num[0]][nex.num[1]][nex.num[2]][nex.num[3]]==0) { s.push(nex); vis[nex.num[0]][nex.num[1]][nex.num[2]][nex.num[3]]=1; } } } return ; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s%s",s1,s2); bfs(); } }