题目链接:

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. hust 1017 dancing links 精确覆盖模板题

    最基础的dancing links的精确覆盖题目 #include <iostream> #include <cstring> #include <cstdio> ...

  2. 字典树模板题 POJ 2503

    #include <cstdio> #include <cstring> ],fr[]; int st; struct Tire{ ]; ]; }node[]; void in ...

  3. Mysql的常见几种错误:1045,1044

    Mysql的常见几种错误: 一.在进入 mysql 数据库时出错   # mysql -u root -p Enter password: ERROR 1045 (28000): Access den ...

  4. 关于NSArray的去重

    提到去重,第一反应就是for或while循环来遍历处理. 然后有了几种思路: 1) 两个循环嵌套 对比 然后去重: 但是这种方法会数据丢失, arr为要去重的数组 ; i<arr.count; ...

  5. SDWebImage实现分析

    该博文来自南峰子的技术博客,文章从下载和缓存俩个大的组件分析到里面一些核心方法的实现,条理清晰,相对于一些一上来就通篇分析实现思路的技术文章, 这篇的讲解思路明确,框架架构也讲的比较清楚.看完这篇再去 ...

  6. delete NULL

    面试某公司的时候,某技术主管说你这delete前没有判断指针是否为NULL,当时我就…… 看来这是个传说中的好习惯,每当delete一个指针的时候,要先判断是不是NULL.比如: if ( p != ...

  7. python学习之-- redis模块操作 HASH

    redis 操作 之 -Hash Hash 操作:hash在内存中的存储格式 name hash n1 ------> k1 -> v1 k2 -> v2 k3 -> v3hs ...

  8. 洛谷——P3119 [USACO15JAN]草鉴定Grass Cownoisseur

    P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...

  9. Java实现拖拽上传

    原文:http://www.open-open.com/code/view/1437358795584 在项目开发中由于实际需求,需要开发拖拽上传的功能,ok! 先看效果图: jsp上传前端代码: & ...

  10. Ulua_toLua_基本案例(一)

    Ulua_toLua_基本案例 在Untiy中用Lua.必需要LuaInterface.LuaInterface的介绍请看:点击打开链接 能够先光写Lua,生成.lua的纯文件.再Unity中通过,l ...