HDU 6171 Admiral(双向宽搜)
来源:互联网 发布:互联网运营书籍 知乎 编辑:程序博客网 时间:2024/06/07 09:55
不过好像可以不用pair<ll,ll>
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<queue>#include<map>using namespace std;typedef long long ll;map< pair<ll,ll> ,int>mp1,mp2;int mp[10][10];struct zb{ int x,y; zb(){}zb(int _x,int _y){ x=_x;y=_y; }}mm[25];struct node{ int a[22]; zb o; pair<ll,ll> hh; pair<ll,ll> vl(){ ll x1=0,x2=0; for(int i=1;i<=10;i++)x1=x1*10+a[i]; for(int i=11;i<=21;i++)x2=x2*10+a[i]; return make_pair(x1,x2); }};int mx[]={-1,-1,1,1};int my[]={0,-1,0,1};bool isok(int x,int y){ return x>=y&&y<=6&&y>=1;}node q1[111111],q2[111111];int main(){ int tmp=1; for(int i=1;i<=6;i++) for(int j=1;j<=i;j++){ mp[i][j]=tmp++; mm[mp[i][j]]=zb(i,j); } node ed; for(int i=1;i<=6;i++){ for(int j=1;j<=i;j++){ ed.a[mp[i][j]]=i-1; } } ed.o=zb(1,1); ed.hh=ed.vl(); int t; scanf("%d",&t); while(t--){ int l1,l2,r1,r2; l1=l2=r1=r2=0; mp1.clear();mp2.clear(); node st;zb oo; for(int i=1;i<=21;i++){ scanf("%d",&st.a[i]); if(st.a[i]==0){ st.o=mm[i]; } } st.hh=st.vl(); if(st.hh==ed.hh)printf("0\n"); else { q1[r1++]=st; q2[r2++]=ed; mp1[st.hh]=1; mp2[ed.hh]=1; int ans,step=0,f=0; for(int ca=1;ca<=10;ca++){ step++; int l=l1,r=r1; while(l!=r&&f==0){ node now=q1[l++],tmp; for(int i=0;i<4;i++){ tmp=now; tmp.o.x+=mx[i]; tmp.o.y+=my[i]; if(isok(tmp.o.x,tmp.o.y)){ // printf("%d %d\n",tmp.o.x,tmp.o.y); swap(tmp.a[mp[tmp.o.x][tmp.o.y]],tmp.a[mp[now.o.x][now.o.y]]); tmp.hh=tmp.vl(); if(mp1.find(tmp.hh)==mp1.end()){ if(mp2.find(tmp.hh)!=mp2.end()){ f=1; ans=step; } else { mp1[tmp.hh]=1; q1[r1++]=tmp; } } } if(f)break; } } l1=l; if(f)break; step++; l=l2,r=r2; while(l!=r&&f==0){ node now=q2[l++],tmp; for(int i=0;i<4;i++){ tmp=now; tmp.o.x+=mx[i]; tmp.o.y+=my[i]; if(isok(tmp.o.x,tmp.o.y)){ swap(tmp.a[mp[tmp.o.x][tmp.o.y]],tmp.a[mp[now.o.x][now.o.y]]); tmp.hh=tmp.vl(); if(mp2.find(tmp.hh)==mp2.end()){ if(mp1.find(tmp.hh)!=mp1.end()){ f=1; ans=step; } else { mp2[tmp.hh]=1; q2[r2++]=tmp; } } } if(f)break; } } l2=l; } if(f)printf("%d\n",ans); else printf("too difficult\n"); } } return 0;}
阅读全文
0 0
- HDU 6171 Admiral(双向宽搜)
- hdu6171 Admiral 双向宽搜
- HDU 6171 Admiral [双向bfs+hash]
- hdu 6171 Admiral 双向bfs+hash
- Hdu 6171 Admiral【双向Bfs+字符串哈希】
- 【多校训练】hdu 6171 Admiral 双向bfs+hash
- HDU 6171 Admiral
- HDU 6171 Admiral 双向搜索(meet in the middle) + 哈希
- 2017多校联合第十场/HDU 6171 Admiral 双向bfs + 哈希
- 2017 Multi-University Training Contest 10 1001 Admiral HDU 6171 (双向搜索 哈希)
- HDU 6171 Admiral (DFS + 剪枝)
- Admiral HDU
- [hdu 6171 Admiral]Hash+暴搜+中途相遇法
- hdu 1401 Solitaire(双向宽搜)
- HDU-2017 多校训练赛10-1001-Admiral
- HDU 1401 Solitaire (双向广搜)
- UVa1658 Admiral
- Admiral UVA
- C#现代OpenGL笔记
- 启发式搜索
- 1296: [SCOI2009]粉刷匠
- js--冒泡机制
- redis安装配置
- HDU 6171 Admiral(双向宽搜)
- 后台将数据传回前台的三种绑定方式(Model,Map,ModelAndView)
- ambari服务启动问题
- hdu 1995 汉诺塔
- 可执行jar(dubbo)打包成window服务
- 30分钟学会EventBus3.0详解(一)(引入和初始化EventBus3.0)
- 加载页,引导页(小红点的绘制)
- Intellij IDEA 使用Spring-boot-devTools无效解决办法
- ZooKeeper-3.4.10的安装和配置