tjut 3095
来源:互联网 发布:四九算法算男女怎么算 编辑:程序博客网 时间:2024/05/21 15:04
#include<cstring> #include<string> #include<iostream> #include<queue> #include<cstdio> #include<algorithm> #include<map> #include<cstdlib> #include<cmath> #include<vector> //#pragma comment(linker, "/STACK:1024000000,1024000000"); using namespace std; #define INF 0x3f3f3f3f long long d[30]; int g[5][5]; struct node { int g[5][5]; int step; int x1,y1; int x2,y2; } p1; map<long long ,int >mp[2]; queue<node>que; int dir[][5]= {{0,1},{0,-1},{1,0},{-1,0}}; bool inbound(node k,int x,int y) { if(x>=0&&x<5&&y>=0&&y<5) { if(k.g[x][y]==INF||k.g[x][y]==12) return false; else return true; return false; } return false; } long long getval(node k) { long long sum=0; for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { if(k.g[i][j]!=INF) { if(k.g[i][j]/10) sum=sum*100+k.g[i][j]; else sum=sum*10+k.g[i][j]; } } } return sum; } void bfsx(int flag) { mp[flag].clear(); node k; while(!que.empty()) que.pop(); que.push(p1); mp[flag][getval(p1)]=1; while(!que.empty()) { k=que.front(); que.pop(); long long pri=getval(k); if(flag) { if(mp[0][pri]) { if(mp[0][pri]+k.step-2<=20) { printf("%d\n",mp[0][pri]+k.step-2); return ; } else continue; } } for(int i=0; i<4; i++) { node temp=k; int s=temp.x1+dir[i][0]; int t=temp.y1+dir[i][1]; if(inbound(temp,s,t)) { temp.step++; if(temp.step>12&&!flag) continue; else if(temp.step>10&&flag) continue; swap(temp.g[temp.x1][temp.y1],temp.g[s][t]); long long pri=getval(temp); if(mp[flag][pri]) continue; mp[flag][pri]=temp.step; temp.x1=s,temp.y1=t; que.push(temp); } } for(int i=0; i<4; i++) { node temp=k; int s=temp.x2+dir[i][0]; int t=temp.y2+dir[i][1]; if(inbound(temp,s,t)) { temp.step++; if(temp.step>12&&!flag) continue; else if(temp.step>10&&flag) continue; swap(temp.g[temp.x2][temp.y2],temp.g[s][t]); long long pri=getval(temp); if(mp[flag][pri]) continue; mp[flag][pri]=temp.step; temp.x2=s,temp.y2=t; que.push(temp); } } } if(flag) printf("No solution!\n"); } int main() { memset(g,0x3f,sizeof g); g[0][2]=12; g[1][1]=1,g[1][2]=2,g[1][3]=3; g[2][0]=4,g[2][1]=5,g[2][2]=6,g[2][3]=7,g[2][4]=8; g[3][1]=9,g[3][2]=10,g[3][3]=11; g[4][2]=12; memcpy(p1.g,g,sizeof g); p1.x1=0,p1.y1=2; p1.x2=4,p1.y2=2; p1.step=1; bfsx(0); int T; scanf("%d",&T); while(T--) { memset(g,0x3f,sizeof g); for(int i=0; i<5; i++) { if(i==0||i==4) scanf("%d",&g[i][2]); else if(i==1||i==3) for(int j=1; j<=3; j++) scanf("%d",&g[i][j]); else for(int j=0; j<5; j++) scanf("%d",&g[i][j]); } int flag=0; for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { if(g[i][j]==0) { g[i][j]=12; if(!flag) p1.x1=i,p1.y1=j; else p1.x2=i,p1.y2=j; flag=1; } } } memcpy(p1.g,g,sizeof g); p1.step=1; bfsx(1); } return 0; }
0 0
- tjut 3095
- tjut 5289
- tjut 5288
- tjut 5294
- tjut 2586
- tjut 5296
- tjut 5297
- tjut 5299
- tjut 5384
- tjut 5387
- tjut 5386
- tjut 5381
- tjut 5400
- tjut 5399
- tjut 5396
- tjut 5398
- tjut 5412
- tjut 5410
- HDOJ-----1498--50 years, 50 colors二分图(最小顶点覆盖)
- Java ConcurrentModificationException异常原因和解决方法
- lintcode斐波那契数列
- 关于进度条(ProgressBar)那些事(笔记)
- zabbix3.0 ubunt14.04安装
- tjut 3095
- poj1797
- Android studio 导入github工程
- EF映射入门
- Eclipse无法启动报An internal error occurred during: "reload maven project". java.lang.NullPointerExceptio
- WIN7清除IE浏览器缓存“一键式”操作
- mysql优化
- 从零开始的Android新项目10 - React Native & Redux
- Tail queue definitions