HDU 1195
双端BFS
/************************************************************************* > File Name: 2.cpp > Author:yuan > Mail: > Created Time: 2014年11月25日 星期二 23时33分09秒 ***********************************************************************/ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; struct node { int mat[4]; int sum; }; int ans; node q1[10005],q2[10005]; int t; int top1,top2,base1,base2; int vis1[10005],vis2[10005]; void copy1(node &s1,node s2) { for(int i=0;i<4;i++) { s1.mat[i]=s2.mat[i]; } } bool check1(node n1) { int num=0; num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3]; if(vis1[num]) return 0; else return 1; } bool check2(node n2) { int num=0; num=n2.mat[0]*1000+n2.mat[1]*100+n2.mat[2]*10+n2.mat[3]; if(vis2[num]) return 0; else return 1; } void BFS() { node n1;int ll=1; while(base1<top1||base2<top2) { int ans1; if(base1<top1){ for(int i=0;i<7;i++) { if(i<4){ copy1(n1,q1[base1]); if(n1.mat[i]==9) n1.mat[i]=1; else n1.mat[i]+=1; if(check1(n1)){ copy1(q1[top1],n1); q1[top1].sum=q1[base1].sum+1; top1++; int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3]; vis1[num]=top1-1; if(vis2[num]) {ans1=q1[top1-1].sum+q2[vis2[num]].sum;ans=min(ans,ans1);} } copy1(n1,q1[base1]); if(n1.mat[i]==1) n1.mat[i]=9; else n1.mat[i]-=1; if(check1(n1)){ copy1(q1[top1],n1); q1[top1].sum=q1[base1].sum+1; top1++; int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3]; vis1[num]=top1-1; if(vis2[num]) {ans1=q1[top1-1].sum+q2[vis2[num]].sum;ans=min(ans,ans1);} } } else { int k=i-4; copy1(n1,q1[base1]); int d=n1.mat[k]; n1.mat[k]=n1.mat[k+1],n1.mat[k+1]=d; if(check1(n1)){ copy1(q1[top1],n1); q1[top1].sum=q1[base1].sum+1; top1++; int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3]; vis1[num]=top1-1; if(vis2[num]) {ans1=q1[top1-1].sum+q2[vis2[num]].sum;ans=min(ans1,ans);} } } } base1++; } if(base2<top2){ for(int i=0;i<7;i++) { if(i<4){ copy1(n1,q2[base2]); if(n1.mat[i]==9) n1.mat[i]=1; else n1.mat[i]+=1; if(check2(n1)){ copy1(q2[top2],n1); q2[top2].sum=q2[base2].sum+1; top2++; int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3]; vis2[num]=top2-1; if(vis1[num]) {ans1=q2[top2-1].sum+q1[vis1[num]].sum;ans=min(ans,ans1);} } copy1(n1,q2[base2]); if(n1.mat[i]==1) n1.mat[i]=9; else n1.mat[i]-=1; if(check2(n1)){ copy1(q2[top2],n1); q2[top2].sum=q2[base2].sum+1; top2++; int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3]; vis2[num]=top2-1; if(vis1[num]) {ans1=q2[top2-1].sum+q1[vis1[num]].sum;ans=min(ans,ans1);} } } else { int k=i-4; copy1(n1,q2[base2]); int d=n1.mat[k];n1.mat[k]=n1.mat[k+1],n1.mat[k+1]=d; if(check2(n1)){ copy1(q2[top2],n1); q2[top2].sum=q2[base2].sum+1; top2++; int num=n1.mat[0]*1000+n1.mat[1]*100+n1.mat[2]*10+n1.mat[3]; vis2[num]=top2-1; if(vis1[num]) {ans1=q2[top2-1].sum+q1[vis1[num]].sum;ans=min(ans1,ans);} } } } base2++; } } } int main() { int t; scanf("%d",&t); while(t--){ ans=0x3ffffff; char str1[5],str2[5]; node q11,q22; scanf("%s",str1);scanf("%s",str2); for(int i=0;i<4;i++) { q11.mat[i]=str1[i]-'0'; q22.mat[i]=str2[i]-'0'; } top1=top2=base1=base2=1; memset(q1,0,sizeof(q1)); memset(q2,0,sizeof(q2)); memset(vis1,0,sizeof(vis1)); memset(vis2,0,sizeof(vis2)); copy1(q1[1],q11); copy1(q2[1],q22); top1++;top2++; BFS(); printf("%d\n",ans); char nnn[10]; gets(nnn); } return 0; }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 想让你多爱自己一些的开源计时器
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析