hdu 1067 Gap

简介:

  

    本来认为是个数学题或者dp题,但是后来看到规则发现用搜索完全可以做

    因为规则限制,每次只能把空白左边下一位的数移动到空白处,所以每次最多走4种情况,这就可以bfs了

    一开始用map的,但是TLE了(虽然不是这个问题)于是手写hash,对999991取了个余,虽然一定不完善,但是数据没那么强。

    手写hash后依旧TLE……最后检查了好几遍才发现是空格左边可能仍是空格,这一点没有考虑到,所以一直TLE(差点手写队列了o(╯□╰)o)

    加了个判断后,500ms就过了……

 

    注意位运算的优先级,今天被坑好几次了

 

/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <map>
#define INF 1E9
using namespace std;
const char ss[32]={11,12,13,14,15,16,17,0,21,22,23,24,25,26,27,0,31,32,33,34,35,36,37,0,41,42,43,44,45,46,47,0};
string aim="";
struct node
{
    int x,y;
};
char m[4][8];
struct state
{
   node pos[50],blank[4];//pos确定每个数字位置,blank是4个空格位置
   string s;//图
   int lvl;//步数
};
string m2s()//把图变成字符串
{
    string now="";
    int i,j;
    for(i=0;i<4;i++)
     for(j=0;j<8;j++)
      now.push_back(m[i][j]);
    return now;
}
int get_hash(string s)//获得hash值
{
    long long ans=0;
    for(int i=0;i<32;i++)
        ans=(ans<<1)+s[i];
    return ans%999991;
}
bool vis[1000000];
queue<state> q;
state now,next;
node temp;
int bfs()
{
    memset(vis,0,sizeof(vis));
    while(!q.empty())q.pop();
    int i,j,t=0,k,o,lvl;
    for(i=0;i<4;i++)
     for(j=0;j<8;j++)
     {
         temp.x=i;temp.y=j;
         if(m[i][j]==0)now.blank[t++]=temp;
         else now.pos[m[i][j]]=temp;
     }
    now.s=m2s();vis[get_hash(now.s)]=1;
    now.lvl=1;
    q.push(now);
    int Aim=get_hash(aim);
    while(!q.empty()&&!vis[Aim])
    {
        now=q.front();q.pop();
        next=now;
        next.lvl=now.lvl+1;
        for(i=0;i<4;i++)
        {
            node &b=next.blank[i];
            o=8*b.x+b.y-1;
            t=next.s[o];
            if(t%10==7||t==0)continue;//注意空格旁还是空格的情况
            k=t+1;
            node &p=next.pos[k];
            k=p.x*8+p.y;
            o++;
            swap(next.s[o],next.s[k]);//移动位置
            t=get_hash(next.s);
            if(!vis[t])
            {
                if(t==Aim)return next.lvl-1;
                swap(p,b);
                q.push(next);
                vis[t]=1;
                swap(p,b);
            }
            swap(next.s[o],next.s[k]);//恢复
        }
    }
    return vis[Aim]-1;
}
int main()
{
   int T;
   for(T=0;T<32;T++)aim.push_back(ss[T]);
   scanf("%d",&T);
   while(T--)
   {
       memset(m,0,sizeof(m));
       int i,j,t;
       for(i=0;i<4;i++)
        for(j=1;j<8;j++)
        {
            scanf("%d",&t);
            m[i][j]=(char)t;
            if(t%10==1) swap(m[i][j],m[(t/10)-1][0]);
        }
       printf("%d\n",bfs());
   }
}


 

目录
相关文章
|
测试技术 网络安全 虚拟化
libvirt虚拟机热迁移
验证不同迁移特性下的热迁移效率。
3043 0
|
负载均衡 前端开发 Java
Feign 踩坑指南 (接口返回泛型设置属性为null)
Feign 简介 Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。
2058 0
Feign 踩坑指南 (接口返回泛型设置属性为null)
|
9月前
|
缓存
银河麒麟server-V10配置镜像源
银河麒麟server-V10配置镜像源
8057 0
|
9月前
|
SQL JSON 数据库
实时数仓 Hologres产品使用合集之写入是否支持分区自动路由功能
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
存储 JavaScript 前端开发
TypeScript实现Map与HashMap
TypeScript实现Map与HashMap
TypeScript实现Map与HashMap
|
物联网
阿里云物联网软/硬件资源入口集合(持续更新)
阿里云官方推荐的云产品入口、云资源购买入口、推荐硬件等
|
Oracle 关系型数据库 数据库
ORA-01155: the database is being opened, closed, mounted or dismounted
<div style="font-family:'lucida Grande',Verdana,'Microsoft YaHei'; font-size:14px; line-height:23px"> <div><br></div> <div>ora.scan1.vip  ora....ip.type ONLINE    ONLINE    m3          </div> <
5828 0
|
缓存 IDE Java
已经使用ant的项目如何利用maven来管理依赖
已经使用ant的项目如何利用maven来管理依赖
|
搜索推荐
BASE理论
BASE是Basiclly Available(基本可用),Soft state(软状态),Eventually consistent(最终一致性)三个短语的缩写。 BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
5092 0
|
8月前
|
存储 分布式计算 DataWorks
MaxCompute产品使用合集之可以通过什么函数将全角字符转成半角字符
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。

热门文章

最新文章