标签:des style http os io for ar art
4 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 41 42 43 44 45 46 47 11 26 31 13 44 21 24 42 17 45 23 25 41 36 11 46 34 14 12 37 32 47 16 43 27 35 22 33 15 17 12 16 13 15 14 11 27 22 26 23 25 24 21 37 32 36 33 35 34 31 47 42 46 43 45 44 41 27 14 22 35 32 46 33 13 17 36 24 44 21 15 43 16 45 47 23 11 26 25 37 41 34 42 12 31
0 33 60 -1
思路:BFS+hash判重。懒得写hash,直接用map了。
#include <stdio.h> #include <map> using namespace std; struct{ int d[4][8],step; }que[10000000],t; map<long long,int>mp; int main() { int T,i,j,p,q,m,n,num; long long temp; bool flag; scanf("%d",&T); while(T--) { mp.clear(); for(i=0;i<4;i++) que[0].d[i][0]=0; for(i=0;i<4;i++) for(j=1;j<8;j++) scanf("%d",&que[0].d[i][j]); for(i=0;i<4;i++) { for(j=1;j<8;j++) { if(que[0].d[i][j]==11) { que[0].d[i][j]=0; que[0].d[0][0]=11; } if(que[0].d[i][j]==21) { que[0].d[i][j]=0; que[0].d[1][0]=21; } if(que[0].d[i][j]==31) { que[0].d[i][j]=0; que[0].d[2][0]=31; } if(que[0].d[i][j]==41) { que[0].d[i][j]=0; que[0].d[3][0]=41; } } } int top=0,bottom=1; que[top].step=0; while(top<bottom) { t=que[top]; flag=1; for(i=0;i<4 && flag;i++) for(j=0;j<7 && flag;j++) if(t.d[i][j]!=(i+1)*10+j+1) flag=0; if(flag) { printf("%d\n",t.step); break; } for(i=0;i<4;i++) { for(j=0;j<8;j++) { if(!t.d[i][j]) { if(t.d[i][j-1] && t.d[i][j-1]%10<7) num=t.d[i][j-1]+1; else continue; flag=0; for(p=0;p<4 && !flag;p++) { for(q=0;q<8 && !flag;q++) { if(t.d[p][q]==num) { t.d[p][q]=0; t.d[i][j]=num; flag=1; t.step++; temp=0; for(m=0;m<4;m++) for(n=0;n<8;n++) temp+=t.d[m][n]*(1LL<<(m*10+n));//哈希 if(!mp[temp]) { que[bottom++]=t; mp[temp]=1; } t.step--; t.d[p][q]=num; t.d[i][j]=0; } } } } } } top++; } if(top==bottom) printf("%d\n",-1); } }
HDU-1067-Gap(BFS+HASH),布布扣,bubuko.com
标签:des style http os io for ar art
原文地址:http://blog.csdn.net/faithdmc/article/details/38510671