题意:类汉诺塔的一个东西……移动规则与汉诺塔一样,但初始状态为题目中给出的每根棍上一个盘子,目标状态为盘子在棍上按大小顺序排列,盘子只能在相邻的棍儿上移动。

解法:广搜并打表记录从目标状态到所有可能的初始状态的答案。我记录每个盘子的位置为状态,vis用七位数组(被队友吐槽还真敢写啊=3=),然后每次转移状态的时候转化为每个棍儿上最小的盘子是啥(反正很抽象又不好解释……我懂就好啦哈哈哈哈哈哈哈哈哈哈(被队友嘲笑自暴自弃中))。答案的记录用转化为排列序数的方式。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
int ans[8][6000];
int fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
int order(int v[], int len)//将排列转化为排列序数
{
int i, j, temp, num;
num = 0;
for(i = 0; i < len - 1; i++)
{
temp = 0;
for(j = i + 1; j < len; j++)
{
if(v[j] < v[i])
temp++;
}
num += fac[v[i] - 1] * temp;
}
return num;
}
struct node
{
int a[10], step;//a数组表示每个盘子放的棍儿的序号
node(int tmp[], int tstep)
{
step = tstep;
memcpy(a, tmp, sizeof a);
}
node() {}
};
bool vis[8][8][8][8][8][8][8];//记录状态
queue <node> q;
bool isanswer(int a[], int n)
{
int stick[8] = {0, 100, 100, 100, 100, 100, 100, 100};
for(int i = 0; i < n; i++)
stick[a[i]] = min(stick[a[i]], i + 1);
for(int i = 1; i <= n; i++)
if(stick[i] == 100) return false;
return true;
}
void bfs(int a[], int n)
{
while(!q.empty()) q.pop();
memset(vis, 0, sizeof vis);
q.push(node(a, 0));
vis[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]][a[6]] = 1;
while(!q.empty())
{
node tmp = q.front();
q.pop();
if(isanswer(tmp.a, n))
{
ans[n][order(tmp.a, n)] = tmp.step;
}
int stick[8] = {0, 100, 100, 100, 100, 100, 100, 100};
for(int i = 0; i < n; i++)
stick[tmp.a[i]] = min(stick[tmp.a[i]], i + 1);//算一下每根棍儿上最小的盘子是啥
for(int i = 1; i <= n; i++)
{
if(stick[i] == 100) continue;
if(i > 1 && (stick[i] < stick[i - 1] || (stick[i] != 100 && stick[i - 1] == 100)))//如果左面有棍儿且棍儿上最小的盘子比当前盘子大或者左面棍儿上没有盘子就转移状态
{
tmp.a[stick[i] - 1] = i - 1;
if(!vis[tmp.a[0]][tmp.a[1]][tmp.a[2]][tmp.a[3]][tmp.a[4]][tmp.a[5]][tmp.a[6]])
{
vis[tmp.a[0]][tmp.a[1]][tmp.a[2]][tmp.a[3]][tmp.a[4]][tmp.a[5]][tmp.a[6]] = 1;
q.push(node(tmp.a, tmp.step + 1));
}
tmp.a[stick[i] - 1] = i;
}
if(i < n && (stick[i] < stick[i + 1] || (stick[i] != 100 && stick[i + 1] == 100)))//同上
{
tmp.a[stick[i] - 1] = i + 1;
if(!vis[tmp.a[0]][tmp.a[1]][tmp.a[2]][tmp.a[3]][tmp.a[4]][tmp.a[5]][tmp.a[6]])
{
vis[tmp.a[0]][tmp.a[1]][tmp.a[2]][tmp.a[3]][tmp.a[4]][tmp.a[5]][tmp.a[6]] = 1;
q.push(node(tmp.a, tmp.step + 1));
}
tmp.a[stick[i] - 1] = i;
}
}
}
}
void init()
{
memset(ans, -1, sizeof ans);
int a[] = {1, 2, 3, 4, 5, 6, 7};
for(int i = 1; i < 8; i++)
bfs(a, i);
}
int main()
{
init();
int T;
scanf("%d", &T);
while(T--)
{
int n, a[10], input[10];
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &input[i]);
map <int, int> m;
for(int i = 0; i < n; i++)
m[input[i]] = i + 1;
map <int, int> :: iterator ite = m.begin();
for(int i = 0; ite != m.end(); ite++, i++) a[i] = ite -> second;
int tmp = order(a, n);
if(~ans[n][tmp])
printf("%d\n", ans[n][tmp]);
else
printf("-1\n");
}
return 0;
}

  

hihocoder 1233 Boxes的更多相关文章

  1. hihoCoder 1233 : Boxes(盒子)

    hihoCoder #1233 : Boxes(盒子) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 There is a strange ...

  2. ACM学习历程—Hihocoder 1233 Boxes(bfs)(2015北京网赛)

    hihoCoder挑战赛12 时间限制:1000ms 单点时限:1000ms 内存限制:256MB   描述 There is a strange storehouse in PKU. In this ...

  3. 2015北京网络赛 G题 Boxes bfs

    Boxes Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc2015beijingonl ...

  4. 2015年北京网赛 boxes(bfs)

    题目链接: http://hihocoder.com/problemset/problem/1233 题目描述: 给定最多七个箱子,每个箱子的重量都不相同,每次都可以将一个箱子放在相邻的位置上,如果相 ...

  5. hihocoder -1121-二分图的判定

    hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...

  6. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  7. hihoCoder太阁最新面经算法竞赛15

    hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...

  8. 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II

    http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...

  9. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

随机推荐

  1. android音乐播放器开发教程

    android音乐播放器开发教程 Android扫描sd卡和系统文件 Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能 android操作sdcard中的多媒体文件——音乐列表 ...

  2. [转]剖析ASP.Net MVC Application

    http://www.cnblogs.com/errorif/archive/2009/02/13/1389927.html 为了完全了解Asp.net MVC是怎样工作的,我将从零开始创建一个MVC ...

  3. JAVASCRIPT的一些知识点梳理

    春节闲点,可以安心的梳理一下以前不是很清楚的东东.. 看的是以下几个URL: http://web.jobbole.com/82520/ http://blog.csdn.net/luoweifu/a ...

  4. 【转载】Eclipse自动编译问题

    今天调试的时候发现问题:调试的时候竟然在我注释的里面走,当时那个郁闷啊,每次都要clean下才可以,晚上感觉不对劲,上网查了查,原来是bulid automatically这个我把勾去掉了,下面是原文 ...

  5. Java中转UTC时间字符串(含有T Z)为local时间

    在Java中我们需要转换相应格式的字符串,很多时候我们想到用SimpleDateFormat类来解析.但是最近我在调用一个第三方的接口时返回的 JSON字符串中有个expires字段的值是2014-0 ...

  6. jQuery动画效果实现

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. XML中如何使用schema

    Schema简介 DTD的语法相当复杂,并且它不符合XML文件的标准,自成一个体系,W3C定义的Schema用来代替DTD. chema相对于DTD的明显好处是XML Schema文档本身也是XML文 ...

  8. linux下用非root用户重启导致ssh无法连接的问题

    问题描述 安装好了centOS服务器,一直用Secure CRT工具通过ssh服务来远程连接linux,很方便的进行各种操作.今天偶然尝试了一下在非root的一般用户下执行重启服务器的命令,发现一般用 ...

  9. java 泛型类

     Java泛型中的标记符含义:  E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Numbe ...

  10. 老韩思考:一个卖豆腐的能转行IT吗? 你的卖点在哪里?

    前言: 我带过的学生很多,各行各业都有,泰牛程序员招生消息放出去后,还有一个在菜市场上卖豆腐的也看我的视频教程,决定转换IT行业,我想,北大毕业的可以卖猪肉,那么卖豆腐的为什么就不能从事IT行业呢?那 ...