HDU-1067 GAP
2015-09-26 00:00
232 查看
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1067题意:
这个题意还是有些乱的,意思是给出的矩阵是[4,8]的但是没有第一列,之后把个位为1的放到第一列,原来的位置就是空位,然后可以把紧随空位前面那张的一张牌放到空位,问把矩阵恢复到[1,1]到[4,7]递增阵的最少步数思路:
简单bfs,状态也不多,甚至不用状压,但是因为是矩阵还是要hash标记一下每个状态。代码:
#define N 1123451 struct node { int g[4][8]; int step; }tn; bool vis ; int getHash(node &t) { int ans=0; for(int i=0;i<4;i++) for(int j=0;j<8;j++) { ans=ans*7+t.g[i][j]%10; ans=ans*7+t.g[i][j]/10; } return (ans&0x7fffffff)%N; } bool judge(node &t) { for(int i=0;i<4;i++) for(int j=0;j<7;j++) if(t.g[i][j]!=(i+1)*10+(j+1)) return false; return true; } void change(node &t,int num) { for(int i=0;i<4;i++) for(int j=0;j<8;j++) if(t.g[i][j]==num+1) { t.g[i][j]=0; return; } } int bfs() { queue<node>q; while(!q.empty())q.pop(); node a,b; int t; memset(vis,false,sizeof(vis)); tn.step=0; for(int i=0;i<4;i++) tn.g[i][0]=(i+1)*10+1; vis[getHash(tn)]=true; q.push(tn); while(!q.empty()) { a=q.front();q.pop(); if(judge(a)) return a.step; for(int i=0;i<4;i++) for(int j=0;j<8;j++) if(a.g[i][j]==0&&a.g[i][j-1]!=0&&a.g[i][j-1]%10!=7) { b=a;b.step++; change(b,b.g[i][j-1]); b.g[i][j]=b.g[i][j-1]+1; t = getHash(b); if(!vis[t]) { vis[t]=true; q.push(b); } } } return -1; } int main() { int i,j,k,kk,t,x,y,z; scanf("%d",&k); while(k--) { memset(tn.g,0,sizeof(tn.g)); for(i=0;i<4;i++) for(j=1;j<8;j++) { scanf("%d",&tn.g[i][j]); if(tn.g[i][j]%10==1) tn.g[i][j]=0; } printf("%d\n",bfs()); } return 0; }
相关文章推荐
- 排序算法:鸡尾酒排序
- Undefined symbols for architecture x86_64错误原因
- Xcode使用[XCTestCase]测试因Mach-O Type引发的错误
- SQL脚本发布管理Flyway
- 安装jar文件到本地maven仓库
- 排序算法-基数排序
- Linux服务搭建之vsftp
- Ember.js 入门指南——路由重定向
- fedora中添加自定义的程序到菜单
- git 操作
- java的四个访问控制符
- Android_完全退出
- 基于Netty UDP实现的简单心跳机制
- c/c++中内存区域划分大总结
- ibatis 一对一多表关联查询的问题
- leetcode笔记:Merge Two Sorted Lists
- esper简介
- esper简介
- esper简介
- esper简介