在线编程在线课堂在线测评Anycodes在线编程

编程论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

How to use bs4??
本帖最后由 carry0987 于
Double Queue 问题描述 : The new founded Balkan Investment Group Bank (
John 问题描述 : Little John is playing very funny game
linux-command Linux命令大全搜索工具,内容包含Linux命令
Coati 是一款跨平台的代码查看工具,适用于 C/C++ 和 Java。商业软件。特性:1. 索引
系统可承载海量并发,消息收发确认机制 保障消息必达 系统采用动态智
全平台视频监控,支持安卓苹果以及pcweb,支持海康大华等主流dvr,全部源码以及文档 单聊、群聊、商
如何访问类的私有属性? 下面以 TPathData 为例,
问题:从 XE4 以来,Firemonkey 曲线绘图在移动平台不平滑的问题一直令人诟病,提交到官方的 QC 也是族繁不及备载,官方似乎有意的
操作数据库(RODBC)   odbcConnect(dsn, uid="", p
数据模式:mode函数显示任何对象的模式。常见的单个的
系统可承载海量并发,消息收发确认机制 保障消息必达 系统采用动态智
RabbitMQ与PHP(一) 项
Iease团队扩编预备中,盼望能有Ruby或者java工程师加盟。全职兼职都可以。有爱好的伴侣请与我接洽。 邮件:i
ruby 怎么设置装备摆设GTK2,求教指导下!
#include #include #include #include using namespace std; int main() {
标题如图所示: 有n盏灯,编号1~n。一开端灯都是关着的
成熟的消息收发确认机制,支持万人大群 支持开发自定义的消息sdk接口,扩展性超强 支持单/
成熟的消息收发确认机制,支持万人大群 支持开发自定义的消息sdk接口,扩展性超强 支持单/
1. 注意列表和集合的区别 set 列表表现形式: list_1
Ajax   Ajax即“Asynchronous Javascript And
大师好,我比来在做布谷鸟优
分辨提取A和B图像Harris角点,接下来须要对

[HDU杭电] HDU 1067 Gap-BFS-[解题报告] C++

[复制链接]
发表于 2016-3-25 22:13:46 | 显示全部楼层 |阅读模式
Gap


问题描述 :
Let’s play a card game called Gap.
You have 28 cards labeled with two-digit numbers. The first digit (from 1 to 4) represents the suit of the card, and the second digit (from 1 to 7) represents the value of the card.First, you shu2e the cards and lay them face up on the table in four rows of seven cards, leaving a space of one card at the extreme left of each row. The following shows an example of initial layout.

HDU 1067 Gap-BFS-[解题报告] C++

HDU 1067 Gap-BFS-[解题报告] C++
Next, you remove all cards of value 1, and put them in the open space at the left end of the rows: "11" to the top row, "21" to the next, and so on.Now you have 28 cards and four spaces, called gaps, in four rows and eight columns. You start moving cards from this layout.

HDU 1067 Gap-BFS-[解题报告] C++

HDU 1067 Gap-BFS-[解题报告] C++
At each move, you choose one of the four gaps and fill it with the successor of the left neighbor of the gap. The successor of a card is the next card in the same suit, when it exists. For instance the successor of "42" is "43", and "27" has no successor.In the above layout, you can move "43" to the gap at the right of "42", or "36" to the gap at the right of "35". If you move "43", a new gap is generated to the right of "16". You cannot move any card to the right of a card of value 7, nor to the right of a gap.The goal of the game is, by choosing clever moves, to make four ascending sequences of the same suit, as follows.

HDU 1067 Gap-BFS-[解题报告] C++

HDU 1067 Gap-BFS-[解题报告] C++
Your task is to find the minimum number of moves to reach the goal layout.
输入:
The input starts with a line containing the number of initial layouts that follow.Each layout consists of five lines – a blank line and four lines which represent initial layouts of four rows. Each row has seven two-digit numbers which correspond to the cards.
输出:
For each initial layout, produce a line with the minimum number of moves to reach the goal layout. Note that this number should not include the initial four moves of the cards of value 1. If there is no move sequence from the initial layout to the goal layout, produce "-1".
样例输入:

  1. 4

  2. 12 13 14 15 16 17 21
  3. 22 23 24 25 26 27 31
  4. 32 33 34 35 36 37 41
  5. 42 43 44 45 46 47 11

  6. 26 31 13 44 21 24 42
  7. 17 45 23 25 41 36 11
  8. 46 34 14 12 37 32 47
  9. 16 43 27 35 22 33 15

  10. 17 12 16 13 15 14 11
  11. 27 22 26 23 25 24 21
  12. 37 32 36 33 35 34 31
  13. 47 42 46 43 45 44 41

  14. 27 14 22 35 32 46 33
  15. 13 17 36 24 44 21 15
  16. 43 16 45 47 23 11 26
  17. 25 37 41 34 42 12 31
复制代码
样例输出:

  1. 0
  2. 33
  3. 60
  4. -1
复制代码
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1067思路:学会了手写Hash。。。orz….纪念一下。
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<queue>
  6. using namespace std;
  7. #define MAXN 1000007
  8. typedef long long ll;
  9. ll Hash[MAXN];

  10. struct Node{
  11.      int map[4][8],step;
  12.      bool operator == (const Node &p) const {
  13.          for(int i=0;i<4;i++)
  14.              for(int j=0;j<8;j++)
  15.                  if(map[i][j]!=p.map[i][j])
  16.                      return false;
  17.          return true;
  18.      }
  19.      //手写hash
  20.      ll HashValue(){
  21.          ll value=0;
  22.          for(int i=0;i<4;i++)
  23.              for(int j=0;j<8;j++)
  24.                  value+=(value<<ll(1))+(ll)map[i][j];
  25.          return value;
  26.      }
  27. };

  28. Node Start,End;

  29. void Initaite(){
  30.      memset(Hash,-1,sizeof(Hash));
  31.      for(int i=0;i<4;i++){
  32.          Start.map[i][0]=0;
  33.          for(int j=1;j<8;j++){
  34.              scanf("%d",&Start.map[i][j]);
  35.          }
  36.      }
  37.      Start.step=0;
  38. }

  39. //最后的结果
  40. void GetEnd(){
  41.      for(int i=0;i<4;i++){
  42.          End.map[i][7]=0;
  43.          for(int j=0;j<7;j++){
  44.              End.map[i][j]=(i+1)*10+(j+1);
  45.          }
  46.      }
  47. }

  48. //取得value的hash值+hash判重
  49. bool HashInsert(ll value){
  50.      int v=value%MAXN;
  51.      while(Hash[v]!=-1&&Hash[v]!=value){
  52.          v+=10;
  53.          v%=MAXN;
  54.      }
  55.      if(Hash[v]==-1){
  56.          Hash[v]=value;
  57.          return true;
  58.      }
  59.      return false;
  60. }

  61. void bfs(){
  62.      queue<Node>Q;
  63.      Node p,q;
  64.      Q.push(Start);
  65.      HashInsert(Start.HashValue());
  66.      while(!Q.empty()){
  67.          p=Q.front();
  68.          Q.pop();
  69.          for(int i=0;i<4;i++){
  70.              for(int j=0;j<8;j++){
  71.                  if(!p.map[i][j]){
  72.                      q=p;
  73.                      q.step++;
  74.                      int value=p.map[i][j-1]+1;//找比map[i][j-1]大1的数
  75.                      if(value==1||value%10==8)continue;//0或者value为7的不能移动
  76.                      int x,y,flag=true;
  77.                      for(int k=0;k<4&&flag;k++){
  78.                          for(int l=1;l<8&&flag;l++){
  79.                              if(p.map[k][l]==value){
  80.                                  x=k,y=l;
  81.                                  flag=false;
  82.                              }
  83.                          }
  84.                      }
  85.                      if(!flag){
  86.                          swap(q.map[i][j],q.map[x][y]);
  87.                          ll value=q.HashValue();
  88.                          //hash判重
  89.                          if(HashInsert(value)){
  90.                              if(q==End){
  91.                                  printf("%d\n",q.step);
  92.                                  return ;
  93.                              }
  94.                              Q.push(q);
  95.                          }
  96.                      }
  97.                  }
  98.              }
  99.          }
  100.      }
  101.      puts("-1");
  102. }

  103. void Solve(){
  104.      int k=0;
  105.      //将11,21,31,41这四个数移到第0列
  106.      for(int i=0;i<4;i++){
  107.          for(int j=1;j<8;j++){
  108.              if(Start.map[i][j]==(k+1)*10+1){
  109.                  swap(Start.map[i][j],Start.map[k][0]);
  110.                  k++,i=0,j=0;
  111.              }
  112.          }
  113.      }
  114.      if(Start==End){
  115.          puts("0");//前四步不记录总步数
  116.          return ;
  117.      }
  118.      bfs();
  119. }

  120. int main(){
  121.      int _case;
  122.      scanf("%d",&_case);
  123.      GetEnd();
  124.      while(_case--){
  125.          Initaite();
  126.          Solve();
  127.      }
  128.      return 0;
  129. }
复制代码
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复

使用道具 举报

发布主题 上个主题 下个主题 快速回复 返回列表 官方QQ群
在线客服
客 服 中 心
群 机 器 人
网站二维码
收 起 客 服

QQ|Archiver|手机版|小黑屋|Anycodes ( ICP14002806Anycodes在线编程

GMT+8, 2018-11-22 01:06 , Processed in 1.671261 second(s), 71 queries .

Powered by Anycodes

© 2001-2013 吉林市群龙科技有限公司 Inc.

快速回复 返回顶部 返回列表