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之前 ...
随机推荐
- P1420 最长连号
洛谷——P1420 最长连号 题目描述 输入n个正整数,(1<=n<=10000),要求输出最长的连号的长度.(连号指从小到大连续自然数) 输入输出格式 输入格式: 第一行,一个数n; 第 ...
- HDU 1558
输入线段的两个短点,如果线段相交那么他们属于一个集合,查看第i条线段所在的集合有几条线段. 好久没码码了,总是各种蠢. 首先找出两条直线的方程,求解相交点的横坐标,然后看是不是在线段内部. 没有注意题 ...
- 洛谷 P1731 [NOI1999]生日蛋糕
P1731 [NOI1999]生日蛋糕 题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M ...
- java.net.URISyntaxException的解决办法
java.net.URISyntaxException的解决办法 近日在用HttpClient访问抓取汇率时,为了省力,直接采用 String url = "http://api.liqwe ...
- OpenWrt 安装python-sqlite3失败
https://dev.openwrt.org/ticket/12239 #12239 reopened defect Sqlite3 missing in python 汇报人: dgspai@- ...
- 有多个git项目要用多个秘钥
在~/.ssh文件夹下新建文件config,格式例如以下 Host "authmanage" HostName "code.csdn.net" User &qu ...
- hdu 3549 Flow Problem(最大流模板题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Problem Description Network flow is a well-known ...
- java克隆对象clone()的使用方法和作用
转自:997.html">http://www.okrs.cn/blog/news/?997.html 内容摘要 若需改动一个对象,同一时候不想改变调用者的对象.就要制作该对象的一个本 ...
- MySQL基础笔记(四) 索引
一.什么是索引 索引(Index),可以看作一个指针,指向表里的数据.当数据库没有索引时,查找信息通常是全表扫描:使用了索引,它就会直接引导到数据在表里的准确物理位置. 优点:索引的主要目的是提高数据 ...
- 使用python生成c文件模板
目标 完成一个python脚本,实现指定名字后,自动生成.c和.h的模板.例如: /** * @file epc.c * @author 陈维 * @version V01 * @date 2017. ...