hdu1067Gap(bfs)

HDU 1067 Gap bfs+hash 传送门:HDU1067 题意:给出表如第一个图,给出每个数,共有28个数,首先要将11,21,31,41放到前面去如第二个图,然后每次可以挑选一个空位把某个数放在此位置,但是要保证此数恰好是空位左边的数的后一个数,比如空位左边的数是42,则只能把43移到空位去。如果是47的话是没有后一个数的。 思路:将32个数做成个字符串然后hash记录,然后bfs搜索。估计用map应该也可以。 代码: 阅读详情

hdu1067Gap
Gap
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1922 Accepted Submission(s): 978

Problem Description
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.

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.

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.

Your task is to find the minimum number of moves to reach the goal layout.

Input
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.

Output
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”.

Sample Input
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

Sample Output
0
33
60
-1

Source
Asia 2003(Aizu Japan)

Recommend
JGShining
反向bfs会爆,也许我写挫了?反正正着暴力一下就好了。。。

#include<bits/stdc++.h>
using namespace std;
string ed="1112131415161700212223242526270031323334353637004142434445464700";
int cnt=0;
unordered_map<string,int>mmp;
void swappos(string &tmp,int a,int b){
    swap(tmp[a<<1],tmp[b<<1]);
    swap(tmp[(a<<1)|1],tmp[(b<<1)|1]);
}
void ist(queue<string>&tmpq,string &tmp,int pos1,int pos2,int nwid){
    swappos(tmp,pos1,pos2);
    if(!mmp.count(tmp)){
        mmp[tmp]=nwid+1;
        tmpq.push(tmp);
        cnt++;
    }//else {cout<<"fuc"<<endl;}
}
int bfs(string st){
    mmp.clear();
    mmp[st]=0;
    queue<string>mq;
    mq.push(st);//cout<<st<<endl;
    while(!mq.empty()){
        string nw=mq.front();
        if(nw==ed)return mmp[nw];
        mq.pop();int nwid=mmp[nw];
        //cout<<nw<<endl;
        int pos[4],nxpos[4],f=0;
        memset(nxpos,-1,sizeof nxpos);
        for(int i=0;i<nw.length();i+=2){
            if(nw[i]=='0'){pos[f++]=i/2;}
        }
        for(int i=1;i<nw.length();i+=2){
            for(int j=0;j<4;j++){
                if(pos[j]>=1&&nw[i-1]==nw[pos[j]*2-2]&&nw[i]==nw[pos[j]*2-1]+1){
                    nxpos[j]=i/2;
                }
            }
        }
        for(int i=0;i<4;i++){
            if(nxpos[i]!=-1){
                ist(mq,nw,nxpos[i],pos[i],nwid);
                swappos(nw,nxpos[i],pos[i]);
            }
        }
    }
    return -1;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        string st="";
        for(int i=1;i<=4;i++){
            st+="00";
            for(int j=1;j<=7;j++){
                int p;
                scanf("%d",&p);
                st+=to_string(p);
            }
        }//cout<<st<<endl;
        for(int i=1;i<st.length();i+=2){
            if(st[i]=='1'){
                swappos(st,(i-1)/2,(int)(st[i-1]-'1')*8);
            }
        }
        printf("%d\n",bfs(st));
    }
    return 0;
}

hdu-1067(最大独立集) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 题意:一个男生集合和一个女生集合,给出两个集合之间一一对应的关系,求出两个集合中最大独立集的点数。 思路:在二分图中,最大独立集的点数=顶点数-最大匹配数/2; 求二分图的最大匹配数需要用匈牙利算法(主要思想是求:增广路径,增广路径的数目=最大匹配数)。 参考文章:https://blo... 阅读详情

相关推荐

搜索进阶------H - 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 va...

qq_36386435的博客 341

HDU-1067

求最短路的问题还是用广度搜索,但问题在于判重不好办,不判重又会暴内存和超时,所以参考了一下别人写的哈希表进行判重。 将4*8的矩阵内的数字按照各自的权值相乘之后加起来对一个素数求模即可得到该状态所对应哈希表的下标。如果有重复就乘10再模一次。 #include #include #include using namespace std; struct node{ int

Phoenix_Wright的博客 561

hdu 1067 bfs+hash

要求:4*8的表格里面有4*7个牌,牌是两位数,十位数不超过4 ,个位数不超过7,第一列刚开始是没有牌,然后把个位数为1的牌放在第1列,其中十位数为i的放在第i排,原来个位数为1的牌的地方留下4个空格。然后开始移动牌,若一个牌为i*10+j,j&lt;7,且右边有空格,则可将数字为i*10+j+1的牌放在该牌右边的空格内。问是否可以移动成下图,若可以,求出最小步数。 方法:bfs+hash ...

Irving0323的博客 329

HDU 1067 Gapbfs+哈希)

题面 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 th...

Yi_Qing_Z的博客 267

HDU1067 GapBFS+MAP】

Gap Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 597    Accepted Submission(s): 327 Problem Description Let's play a card game

长风的专栏 2433

[HDU 1067] Gap BFS+哈希

每次将比空白格前面一个数字大一的数字移动到空白格,如果空白格前面数字的个位数是 7 或者空白格前面是空白格则不能移动到这里。

AcmHonor的专栏 770

hdu 1067 Gap bfs+hash

Gap Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 431    Accepted Submission(s): 239 Problem Description Let's play a card ga

To be what you what to be! 1429

HDU 1067 GapBFS

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 va...

H4ppyD0g的博客 224

Gap HDU - 1067 BFS,模拟

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 t...

dianzhenquan3519的博客 174

HDU - 1067 GapBFS+字符串压缩状态】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1067 一开始看题目的时候,最苦恼的就是题目存在的状态数太多,空格可能存放的数字有28个,那么可能的状态就有 28!种,这个数目显然很大,所以不知道如何做。但事实上并不用都遍历一遍,虽然我知道,只要四个空格左边的数都是个位数为7的数,那么就可以肯定无解,这样能减少不少耗时,但是我没想到能减这么多。 ...

Y390d的博客 280

hdu 1067 Gap bfs+hash

#include #include #include #include #include using namespace std; #define MAXN 1000007 struct node { int dis; __int64 m[5][9]; int posx[5]; int pos

1419

Gap HDU - 1067 BFS

暴力bfs + map判重#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <cstring> #include <queue> #include <cmath> #include <map>using namespace std;struct node { char a

WsMiracle的博客 337

[kuangbin]专题二 搜索进阶 Gap HDU - 1067BFS】【哈希】

【题目描述】 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 t...

inv0ker的博客 375

HDU 1067 Gap

HDU 1067 Gap Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) ProblemDescription -题目描述   Let's play a card game called Gap.   You have 28 card...

181

hdu 1067 Gap+BFS+hash

题目大意:给一个4行8列方格,每个方格中保存一个两位数,该两位数的第十位为一个1~4的整数,个位为一个1~7的整数,经过有限步到达最终的状态如下所示: 刚开始时的第一列数位空,其中一组数据如下所示: 首先移动11,21,31,41到第一列对应的空位置,这四个值的移动不计入移动步数之内,如上图移动后的效果如下所示: 然后每次的移动就按照如下的规则进行移动:该空格左边为一个个位数不为7的

凌语小辉 750

HDU 1067 Gap(哈希+bfs

Gap Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 995    Accepted Submission(s): 524 Problem Description Let's play a card game cal

yasolx的博客 1223

HDU-1067-Gap(BFS+HASH)

Problem Description 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

青春无悔 1334
上一篇: hdu3085Nightmare Ⅱ(双向BFS)
下一篇: hdu2102A计划(bfs)
IDrandom
博客等级 码龄12年 31粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值