2015年北京网赛 boxes(bfs)
题目链接:
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)的更多相关文章
- ACM学习历程—Hihocoder 1233 Boxes(bfs)(2015北京网赛)
hihoCoder挑战赛12 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There is a strange storehouse in PKU. In this ...
- hiho 1227 找到一个恰好包含n个点的圆 (2015北京网赛 A题)
平面上有m个点,要从这m个点当中找出n个点,使得包含这n个点的圆的半径(圆心为n个点当中的某一点且半径为整数)最小,同时保证圆周上没有点. n > m 时要输出-1 样例输入43 2 0 0 1 ...
- hihocoder-1389&&2016北京网赛07 Sewage Treatment(二分+网络流)
题目链接: Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people could ...
- hihoCoder1388 Periodic Signal(2016北京网赛F:NTT)
题目 Source http://hihocoder.com/problemset/problem/1388 Description Profess X is an expert in signal ...
- 北京网赛I题 hiho1391 (树状数组、区间覆盖最大值问题)
题目链接:http://hihocoder.com/problemset/problem/1391 题意:A国和B国向对方分别投射N枚和M枚导弹(发射时间,飞行时间,伤害值),同时两国各自都有防御系统 ...
- hihocoder-1391&&北京网赛09 Countries(优先队列)
题目链接: Countries 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are two antagonistic countries, country ...
- 2015年沈阳网赛 Jesus Is Here(DP中的计数问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5459 题目描述:给定一个递推得来的字符串,问字符串中不同cff之间的距离之和, 递推规则: s1=c; ...
- 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 ...
- 2015北京网络赛 J Scores bitset+分块
2015北京网络赛 J Scores 题意:50000组5维数据,50000个询问,问有多少组每一维都不大于询问的数据 思路:赛时没有思路,后来看解题报告也因为智商太低看了半天看不懂.bitset之前 ...
随机推荐
- HDU1711 最基础的kmp算法
Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], .... ...
- 【模拟】2017 Multi-University Training Contest 1 The Battle of Chibi
acm.hdu.edu.cn/showproblem.php?pid=5542 [Accepted] #include<iostream> #include<cstdio> # ...
- vim—基本命令1
---------------------------------------------------------------2015.07.27 :b 1 -> 切换到当前缓冲区 :2 4 ...
- HDU 2255 二分图最佳匹配
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 洛谷—— P1977 出租车拼车
https://www.luogu.org/problem/show?pid=1977 题目背景 话说小 x 有一次去参加比赛,虽然学校离比赛地点不太远,但小 x 还是想坐 出租车去.大学城的出租车总 ...
- P1396 营救 洛谷
https://www.luogu.org/problem/show?pid=1396 题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起 ...
- CentOS 6.X配置 NFS以及启动和mount挂载
一.环境介绍: 服务器:centos 192.168.1.225 客户端:centos 192.168.1.226 二.安装: NFS的安装配置:centos 5 : yum -y install n ...
- [Angular] Write Compound Components with Angular’s ContentChild
Allow the user to control the view of the toggle component. Break the toggle component up into multi ...
- Spring之IOC篇章具体解释
专题一 IOC 1.接口以及面向接口编程 a.结构设计中,分清层次以及调用关系,每层仅仅向外(或者上层)提供一组功能接口,各层间仅依赖接口而非实现类这样做的优点是,接口实现的变动不影响各层间的调用 ...
- Office EXCEL 如何将复制的一堆数据按空格断开
1 复制粘贴一堆数据,点击数据-分类,然后点击下一步 2 一直下一步 3 最后效果如下图所示