HDU-3567 Eight II
2015-09-25 22:07
295 查看
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=3567题意:
八数码问题,就是终止情况不固定。思路:
类似于魔板那题的解法,重点是状态的转换,然后打表解题即可。代码丑陋,写的暴力了代码:
#define N 501234 char ss[10]; struct node { char str[10]; int pos; int index; }; struct res { int now,fa; }res[10] ; int vis[11] ; int fac[] = {1,1,2,6,24,120,720,5040,40320}; int over,cnt; int ans ; int KT(char ss[]) { int i, j, t, sum; int s[10]; for(i=0;i<9;i++) { if(ss[i]=='X') s[i]=0; else s[i]=ss[i]-'0'; } sum = 0; for (i=0; i<9; i++) { t = 0; for (j=i+1; j<9; j++) if (ss[j] < ss[i]) t++; sum += t*fac[9-i-1]; } return sum+1; } bool bfs(int now) { char c; queue<node> q; while(!q.empty())q.pop(); over = KT(ss); node g,h; for(int i=0;i<8;i++) g.str[i]=i+1+'0'; for(int i=7;i>=now;i--) g.str[i+1]=g.str[i]; g.str[now]='X';g.str[9]='\0'; g.pos=0;g.index=now; int t=KT(g.str); vis[now][t] = 0; q.push(g); cnt=1; while(!q.empty()) { g=q.front();q.pop(); int t = KT(g.str); h=g; if(h.index<6) { c=h.str[h.index];h.str[h.index]=h.str[h.index+3];h.str[h.index+3]=c; h.index+=3; res[now][cnt].now=2;res[now][cnt].fa=h.pos;h.pos=cnt;cnt++; int t=KT(h.str); if(vis[now][t]==-1) { vis[now][t]=cnt-1; q.push(h); } } h=g; if(h.index%3!=0) { c=h.str[h.index];h.str[h.index]=h.str[h.index-1];h.str[h.index-1]=c; h.index--; res[now][cnt].now=3;res[now][cnt].fa=h.pos;h.pos=cnt;cnt++; int t=KT(h.str); if(vis[now][t]==-1) { vis[now][t]=cnt-1; q.push(h); } } h=g; if((h.index+1)%3!=0) { c=h.str[h.index];h.str[h.index]=h.str[h.index+1];h.str[h.index+1]=c; h.index++; res[now][cnt].now=4;res[now][cnt].fa=h.pos;h.pos=cnt;cnt++; int t=KT(h.str); if(vis[now][t]==-1) { vis[now][t]=cnt-1; q.push(h); } } h=g; if(h.index>2) { c=h.str[h.index];h.str[h.index]=h.str[h.index-3];h.str[h.index-3]=c; h.index-=3; res[now][cnt].now=1;res[now][cnt].fa=h.pos;h.pos=cnt;cnt++; int t=KT(h.str); if(vis[now][t]==-1) { vis[now][t]=cnt-1; q.push(h); } } } return false; } int main() { int i,j,k,kk,t,x,y,z; int num[11]; #ifndef ONLINE_JUDGE freopen("test.txt","r",stdin); #endif memset(vis,-1,sizeof(vis)); res[0][0].now=-1;bfs(0); res[1][0].now=-1;bfs(1); res[2][0].now=-1;bfs(2); res[3][0].now=-1;bfs(3); res[4][0].now=-1;bfs(4); res[5][0].now=-1;bfs(5); res[6][0].now=-1;bfs(6); res[7][0].now=-1;bfs(7); res[8][0].now=-1;bfs(8); scanf("%d",&k); kk=0; while(k--) { scanf("%s",ss); for(i=0,j=0;i<9;i++) { if(ss[i]=='X') x=i; else num[ss[i]-'0']=j++; } scanf("%s",ss); for(i=0;i<9;i++) { if(ss[i]=='X')continue; else ss[i]=num[ss[i]-'0']+'1'; } t = KT(ss); over=0; printf("Case %d: ",++kk); t = vis[x][t]; while(res[x][t].now!=-1) { ans[over++]=res[x][t].now; t=res[x][t].fa; } printf("%d\n",over); for(i=over-1;i>=0;i--) { if(ans[i]==1)printf("u"); if(ans[i]==2)printf("d"); if(ans[i]==3)printf("l"); if(ans[i]==4)printf("r"); } printf("\n"); } return 0; }
相关文章推荐
- 最大子矩阵 滴滴打车2016笔试
- 如何将数据库连接字符串保存在配置文件中并读取
- 如何将数据库连接字符串保存在配置文件中并读取
- 项目总结之百度地图定位的简单应用
- USB驱动——USB枚举
- mobile angualar ui的简单使用
- vector容器的遍历
- hihoCoder 1233 Boxes(状态压缩)
- 野人学Android基础篇之网络通讯第一课--HttpUrlConnection的使用
- iOS项目开发实战——UIImageView的使用与图片显示模式
- 百度地图环境搭建的问题
- MAC OS X 10.10编译android5.0源码 步骤 以及 遇到的问题
- Xcode下的DerivedData文件
- 二叉树镜像--20150924
- 我的要求很简单,有历史版本功能。协作我当用不上,没有人可以协作(快盘以前是金山的,2014年快盘被迅雷收购)
- Unity3D 多进程注意事项
- 斐波那契查找原理详解与实现
- 贝叶斯网络
- 如何彻底删除 Mac OS X 里那巨大的 sleepimage 文件
- 一个长度为N的数组中包含正数 负数 0,请实现一个函数找出和为0的最长子数列