HDU - 1067 Gap 【BFS+字符串压缩状态】

深度学习模型压缩方法综述(二) 目前在深度学习领域分类两个派别,一派为学院派,研究强大、复杂的模型网络和实验方法,为了追求更高的性能;另一派为工程派,旨在将算法更稳定、高效的落地在硬件平台上,效率是其追求的目标。复杂的模型固然具有更好的性能,但是高额的存储空间、计算资源消耗是使其难以有效的应用在各硬件平台上的重要原因。 阅读详情

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1067

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

所以用字符串压缩状态,并用map来记录遍历过的状态就行了。

#include <iostream>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

const int INF = 0x3f3f3f3f;
const int Maxn = 4e5+10;

struct Node {
    char stat[80];
    int step;
};

char Ed[80];

void bfs(char *ss) {
    map<string, int> vis;
    queue<Node> qu;
    Node tmp;
    memcpy(tmp.stat, ss, sizeof(tmp.stat));
    tmp.step = 0;
    qu.push(tmp);
    vis[ss] = 1;

    while (!qu.empty()) {
        tmp = qu.front(); qu.pop();
        if(!strcmp(tmp.stat, Ed)) {
            printf("%d\n", tmp.step); return;
        }
        int len = strlen(tmp.stat);

        for(int i = 0; i < len; i += 2) {
            if(tmp.stat[i] == '0' && (tmp.stat[i-1] != '7' || tmp.stat[i-1] != '0')) {
                Node now = tmp; now.step++;

                for(int j = 0; j < len; j += 2) {
                    if(now.stat[j] == tmp.stat[i-2] && now.stat[j+1] == tmp.stat[i-1]+1) {
                        now.stat[i] = now.stat[j]; now.stat[i+1] = now.stat[j+1];
                        now.stat[j] = now.stat[j+1] = '0';
                        if(!vis[now.stat]) {
                            vis[now.stat] = 1; qu.push(now);
                        }
                        break;
                    }
                }
            }
        }
    }
    printf("-1\n");
}

int main(void)
{
    int T;
    scanf("%d", &T);
    while (T--) {
        char str[80]; int tmp, p = 0;
        for(int i = 1; i <= 4; ++i) {
            str[p++] = '0'+i; str[p++] = '1';
            for(int j = 2; j <= 8; ++j) {
                scanf("%d", &tmp);
                if(tmp == 11 || tmp == 21 || tmp == 31 || tmp == 41) {
                    str[p++] = '0'; str[p++] = '0';
                } else {
                    str[p++] = '0'+(tmp/10);
                    str[p++] = '0'+(tmp%10);
                }
            }
        }
        str[p] = '\0';

        p = 0;
        for(int i = 1; i <= 4; ++i) {
            for(int j = 1; j <= 7; ++j) {
                Ed[p++] = i+'0'; Ed[p++] = j+'0';
            }
            Ed[p++] = '0'; Ed[p++] = '0';
        }
        Ed[p] = '\0';
        bfs(str);
    }
	return 0;
}

 

PCI-Express、MiniPCIe、ExpressCard接口转换说明/引脚互换关系 通过引脚PIN互换可以在PCI-Express、MiniPCIe、ExpressCard之间切换不同的接口;提供接口引脚表和标准尺寸图。 阅读详情

相关推荐

Flink 作业报错——TaskManager连接不上

Flink 作业报错——TaskManager连接不上

lm223的博客 1875

HDU 1067 Gap bfs+hash

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

WA是一笔财富 471

python【力扣LeetCode算法题库】面试题 01.06-字符串压缩

面试题 01.06. 字符串压缩 字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。 示例1: 输入:“aabcccccaaa” 输出:“a2b1c5a3” 示例2: 输入:“abbccd” 输出:“abbccd” ...

NJU phd 在读。 1151

《ACM竞赛-C/C++入门》 C语言-27

尹成老师带你步入C语言基础的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以C语言为核心,完整精彩的演练了C语言操作流程以及各种精彩的小项目等,提高竞赛能力,非常适合同学们学习!

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

hdu1067 N - Gap

Home Problems Status Contest [ak1] Logout WUST ACM CLUB SUMMER TRAINING (3) 277:06:36 307:00:00 Overview Problem Status Rank A B C D E F G H I J K L M N O

习惯与规则决定命运 1968

HDU 1067 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

CS33sun的博客 489

每日总结2021.5.5

1.cf Array Destruction https://codeforces.com/contest/1474/problem/C 大意:T组测试样例(T<=1000),每组给定一个n(n<=1000)接下来给定一个长度为n*2的序列a。1<=ai<=1e6. 问是否能确定一个数X,满足以下条件,在序列中找到两个数使他们的和为X,删除这两个数,然后X更新成两个数中较大的那个,直到序列全部被删除。如果可以全部被删除第一行输出YES,接下来一行输出X,接下来n行输出每一步删除的两个

m0_51488693的博客 158

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的博客 1222

基本字符串压缩(程序员面试金典+string)字符串操作

基本字符串压缩 参与人数:1661时间限制:3秒空间限制:32768K通过比例:15.52%最佳记录:0 ms|0K(来自  牛客游客) 题目描述 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。 给定一个string ini

寻找&星空の孩子 2911

HDU 1020 Encoding 典型的字符串压缩

http://acm.hdu.edu.cn/showproblem.php?pid=1020 例如 AAAAEEEECCCCCAAA 则输出 4A4E5C3A的结果                         //切记如果用字符数组统计个数 一位字符最多统计的个数为9个,超过9个就变成两个字符来统计的了。 post code: 正确代码 #include #include cha

yangshuolll的专栏 874

Gap HDU - 1067

点击打开链接 第一次用哈希 感觉和状压就是一回事。。 #include &lt;bits/stdc++.h&gt; using namespace std; #define M 1000007 struct node { int t[10][10]; int s; }; queue &lt;node&gt; que; int num[10][10],tar[10][10]...

sunyutian1998的博客 426

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

青春无悔 1333

PAT (Basic Level) Practise (中文) 1078. 字符串压缩解压 (20)

#文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba。 解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。 本题需要你根据压缩解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字

Tony6666_的博客 745

ACM 压缩字符串

输入:aabbccdef 输出:2a2b2cdef #include #include #include #include #include #include using namespace std; int main() { string s; getline(cin,s); vector str(s.begin(),s.begin()+ s.length());

小宇的博客 828

hdu 1067 Gap bfs+hash

t #include #include #include #include #include using namespace std; struct Node{ int map[4][8]; }; int map1[4][8]; Node queue[100001]; sethaha; int dist[100001]; int en; int

G.D.Retop的专栏 823

HDU 1067 Gap

题目链接 char = int 小数字直接映射字符串 感谢[kuangbin]的专题,学到了许多 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 ...

qq_43735840的博客 248

HDU-1067

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

Phoenix_Wright的博客 560

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

Dogs vs. Cats Kaggle猫狗大战数据集

该资源为Dogs vs. Cats Kaggle猫狗大战数据集,赶快下载实践吧!

上一篇: ZOJ - 2477 Magic Cube 【迭代加深+模拟】
下一篇: HDU - 2102 A计划 【BFS】
Y390d
博客等级 码龄9年 11粉丝 165原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值