题目链接:

http://hihocoder.com/problemset/problem/1233

题目描述:

给定最多七个箱子,每个箱子的重量都不相同,每次都可以将一个箱子放在相邻的位置上,如果相邻位置上的箱子的重量比它大,那么可以放在相邻位置上的箱子,

小就不可以,问通过这样的操作最少需要多少步可以将这些箱子排好序?

由于最多是7个箱子,而且每个箱子的重量都不相同,那么最多有7!个状态,通过bfs每次需要更新的状态最多有12个状态,可以承受。

接下来就是怎样表示状态了,由于某一个位置可能会有很多个数,所以不能直接记录,可以记录每个数所在的位置来表示状态。

还有一点就是需要将大数化小数,同样是记录位置,然后排个序,找出它们之间的大小关系,就可以大数化小数了。

#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
int vis2[8][8];
int vis3[8][8][8];
int vis4[8][8][8][8];
int vis5[8][8][8][8][8];
int vis6[8][8][8][8][8][8];
int vis7[8][8][8][8][8][8][8];
bool check(int a[],int n,int step){
if(n==2){
if(vis2[a[1]][a[2]]!=-1) return 0;
else {
vis2[a[1]][a[2]]=step;return 1;
}
}
else if(n==3){
if(vis3[a[1]][a[2]][a[3]]!=-1) return 0;
else {
vis3[a[1]][a[2]][a[3]]=step;return 1;
}
}
else if(n==4){
if(vis4[a[1]][a[2]][a[3]][a[4]]!=-1) return 0;
else {
vis4[a[1]][a[2]][a[3]][a[4]]=step;return 1;
}
}
else if(n==5){
if(vis5[a[1]][a[2]][a[3]][a[4]][a[5]]!=-1) return 0;
else {
vis5[a[1]][a[2]][a[3]][a[4]][a[5]]=step;return 1;
}
}
else if(n==6){
if(vis6[a[1]][a[2]][a[3]][a[4]][a[5]][a[6]]!=-1) return 0;
else {
vis6[a[1]][a[2]][a[3]][a[4]][a[5]][a[6]]=step;return 1;
}
}
else if(n==7){
if(vis7[a[1]][a[2]][a[3]][a[4]][a[5]][a[6]][a[7]]!=-1) return 0;
else {
vis7[a[1]][a[2]][a[3]][a[4]][a[5]][a[6]][a[7]]=step;return 1;
}
}
}
struct node
{
int pos[10];
int step;
};
void bfs(int n)
{
int a[10];
node start;
for(int i=1;i<=n;i++)
a[i]=i;
check(a,n,0); //首先初始化,起始状态step等于0
for(int i=1;i<=n;i++)
start.pos[i]=i;
start.step=0;
queue < node > que;
que.push(start);
while(!que.empty())
{
node cur=que.front();
que.pop();
for(int i=1;i<=n;i++)
{
int l=0,r=0;
for(int j=1;j<i;j++)
{
if(cur.pos[j]==cur.pos[i]-1) l=1; //l==1,说明左边比它小,不能往左移
if(cur.pos[j]==cur.pos[i]+1) r=1;
if(cur.pos[j]==cur.pos[i]) l=r=1;//不能左移或者右移
}
if(cur.pos[i]-1<1) l=1;
if(cur.pos[i]+1>n) r=1;
if(l==0)
{
cur.pos[i]--; cur.step++;
if(check(cur.pos,n,cur.step)) que.push(cur);
cur.pos[i]++; cur.step--;
}
if(r==0)
{
cur.pos[i]++; cur.step++;
if(check(cur.pos,n,cur.step)) que.push(cur);
cur.pos[i]--; cur.step--;
}
}
}
}
void init()
{
memset(vis2,-1,sizeof(vis2));
memset(vis3,-1,sizeof(vis3));
memset(vis4,-1,sizeof(vis4));
memset(vis5,-1,sizeof(vis5));
memset(vis6,-1,sizeof(vis6));
memset(vis7,-1,sizeof(vis7));
for(int i=2;i<=7;i++)
bfs(i);
}
struct num
{
int data,id;
}input[10];
bool cmp(num a,num b)
{
if(a.data<b.data)
return 1;
else
return 0;
}
int main()
{
int b[10];
// freopen("test.txt","r",stdin);
int t;
scanf("%d",&t);
init();
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&input[i].data);
input[i].id=i;
}
sort(input+1,input+n+1,cmp);
for(int i=1;i<=n;i++)
{
b[i]=input[i].id;
}
if(n==1)
printf("0\n");
if(n==2)
printf("%d\n",vis2[b[1]][b[2]]);
if(n==3)
printf("%d\n",vis3[b[1]][b[2]][b[3]]);
if(n==4)
printf("%d\n",vis4[b[1]][b[2]][b[3]][b[4]]);
if(n==5)
printf("%d\n",vis5[b[1]][b[2]][b[3]][b[4]][b[5]]);
if(n==6)
printf("%d\n",vis6[b[1]][b[2]][b[3]][b[4]][b[5]][b[6]]);
if(n==7)
printf("%d\n",vis7[b[1]][b[2]][b[3]][b[4]][b[5]][b[6]][b[7]]);
}
return 0;
}

2015年北京网赛 boxes(bfs)的更多相关文章

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

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

  2. hiho 1227 找到一个恰好包含n个点的圆 (2015北京网赛 A题)

    平面上有m个点,要从这m个点当中找出n个点,使得包含这n个点的圆的半径(圆心为n个点当中的某一点且半径为整数)最小,同时保证圆周上没有点. n > m 时要输出-1 样例输入43 2 0 0 1 ...

  3. hihocoder-1389&&2016北京网赛07 Sewage Treatment(二分+网络流)

    题目链接: Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people could ...

  4. hihoCoder1388 Periodic Signal(2016北京网赛F:NTT)

    题目 Source http://hihocoder.com/problemset/problem/1388 Description Profess X is an expert in signal ...

  5. 北京网赛I题 hiho1391 (树状数组、区间覆盖最大值问题)

    题目链接:http://hihocoder.com/problemset/problem/1391 题意:A国和B国向对方分别投射N枚和M枚导弹(发射时间,飞行时间,伤害值),同时两国各自都有防御系统 ...

  6. hihocoder-1391&&北京网赛09 Countries(优先队列)

    题目链接: Countries 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are two antagonistic countries, country ...

  7. 2015年沈阳网赛 Jesus Is Here(DP中的计数问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5459 题目描述:给定一个递推得来的字符串,问字符串中不同cff之间的距离之和, 递推规则: s1=c; ...

  8. 2015北京网络赛 D-The Celebration of Rabbits 动归+FWT

    2015北京网络赛 D-The Celebration of Rabbits 题意: 给定四个正整数n, m, L, R (1≤n,m,L,R≤1000). 设a为一个长度为2n+1的序列. 设f(x ...

  9. 2015北京网络赛 J Scores bitset+分块

    2015北京网络赛 J Scores 题意:50000组5维数据,50000个询问,问有多少组每一维都不大于询问的数据 思路:赛时没有思路,后来看解题报告也因为智商太低看了半天看不懂.bitset之前 ...

随机推荐

  1. NOIP2014D2T2寻找道路(Spfa)

    洛谷传送门 这道题可以把边都反着存一遍,从终点开始深搜,然后把到不了的点 和它们所指向的点都去掉. 最后在剩余的点里跑一遍spfa就可以了. ——代码 #include <cstdio> ...

  2. [Vijos1617] 超级教主(DP + 单调队列)

    传送门 设 f[i] 表示吃完 f[i] 及其以下的能量球后所剩下的能量. 所以 f[i] = max(f[i], f[j] + (sum[i] - sum[j]) - i * 100) ( 0 &l ...

  3. django学习之- 动态验证码学习

    实例:通过前台和后台,实现用户登录页面动态图片验证码校验,图片验证码部分使用Pillow模块实现,作为单独学习部分记录. 前端: <!DOCTYPE html> <html lang ...

  4. 转 常见hash算法的原理

    散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫 ...

  5. Windows下SVN服务器及客户端的使用

    原文地址:windows下配置VisualSVN Server服务器 作者:Deem_passion 下载安装文件: 服务端安装文件:VisualSVN-Server-1.6.2 客户端安装文件:To ...

  6. zmq.error.ZMQError: Address already in use

    1.如下代码,启动的时候python app.py会报如题的错误 app.py #!/user/bin python # -*- coding:utf-8 -*- import os from dat ...

  7. sgu208:Toral Tickets(P&#243;lya定理)

    题意简述:给你N和M,对于一个N∗M的单面方格纸你能够对它的每 个个格子黑白染色.然后把方格纸的长边卷起来,卷成一个圆柱体,然后再把 两个短边形成的圆也接起来.形成一个游泳圈的形状(我们染的色仅仅在游 ...

  8. iOS开发--URL中汉字出现乱码

    NSURL *nurl=[[NSURL alloc] initWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF ...

  9. CDN具体解释(篇二)

    还有还有一个问题就是全部的内容都放在同一个地方.假设我们的server在芝加哥,那么美国中西部的人们訪问server的响应时间和用户体验就比香港.德国.南非以及佛罗里达州的用户好.由于那些用户离ser ...

  10. 微信小程序实战之 pay(支付页面)

    项目目录: 逻辑层: pay.js // pages/pay/pay.js Page({ /** * 页面的初始数据 */ data: { resultType: "", resu ...