POJ 1324 Holedox Moving (状压BFS)

Time Limit: 5000MS Memory Limit: 65536K

Total Submissions: 18091 Accepted: 4267

Description

During winter, the most hungry and severe time, Holedox sleeps in its lair. When spring comes, Holedox wakes up, moves to the exit of its lair, comes out, and begins its new life.

Holedox is a special snake, but its body is not very long. Its lair is like a maze and can be imagined as a rectangle with n*m squares. Each square is either a stone or a vacant place, and only vacant places allow Holedox to move in. Using ordered pair of row and column number of the lair, the square of exit located at (1,1).

Holedox's body, whose length is L, can be represented block by block. And let B1(r1,c1) B2(r2,c2) .. BL(rL,cL) denote its L length body, where Bi is adjacent to Bi+1 in the lair for 1 <= i <=L-1, and B1 is its head, BL is its tail.

To move in the lair, Holedox chooses an adjacent vacant square of its head, which is neither a stone nor occupied by its body. Then it moves the head into the vacant square, and at the same time, each other block of its body is moved into the square occupied by the corresponding previous block.

For example, in the Figure 2, at the beginning the body of Holedox can be represented as B1(4,1) B2(4,2) B3(3,2)B4(3,1). During the next step, observing that B1'(5,1) is the only square that the head can be moved into, Holedox moves its head into B1'(5,1), then moves B2 into B1, B3 into B2, and B4 into B3. Thus after one step, the body of Holedox locates in B1(5,1)B2(4,1)B3(4,2) B4(3,2) (see the Figure 3).

Given the map of the lair and the original location of each block of Holedox's body, your task is to write a program to tell the minimal number of steps that Holedox has to take to move its head to reach the square of exit (1,1).



Input

The input consists of several test cases. The first line of each case contains three integers n, m (1<=n, m<=20) and L (2<=L<=8), representing the number of rows in the lair, the number of columns in the lair and the body length of Holedox, respectively. The next L lines contain a pair of row and column number each, indicating the original position of each block of Holedox's body, from B1(r1,c1) to BL(rL,cL) orderly, where 1<=ri<=n, and 1<=ci<=m,1<=i<=L. The next line contains an integer K, representing the number of squares of stones in the lair. The following K lines contain a pair of row and column number each, indicating the location of each square of stone. Then a blank line follows to separate the cases.

The input is terminated by a line with three zeros.

Note: Bi is always adjacent to Bi+1 (1<=i<=L-1) and exit square (1,1) will never be a stone.

Output

For each test case output one line containing the test case number followed by the minimal number of steps Holedox has to take. "-1" means no solution for that case.

Sample Input

5 6 4

4 1

4 2

3 2

3 1

3

2 3

3 3

3 4

4 4 4

2 3

1 3

1 4

2 4

4

2 1

2 2

3 4

4 2

0 0 0

Sample Output

Case 1: 9

Case 2: -1

Hint

In the above sample case, the head of Holedox can follows (4,1)->(5,1)->(5,2)->(5,3)->(4,3)->(4,2)->(4,1)->(3,1)->(2,1)->(1,1) to reach the square of exit with minimal number of step, which is nine.

题目解析

状压BFS,除了头结点,其他结点用和前一个结点相对位置来记录

代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define CLR(a,b) memset(a,b,sizeof(a))
using namespace std; const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
int n,m,k; int vis[22][22][1<<14];
int stone[22][22];
int ans = -1; //void show(int z)
//{
// for(int i = (k-1)*2-1; i>=0; i--){
// if((1<<i)&z) cout<<"1";
// else cout<<"0";
// }
//} struct Snake
{
int x,y;
int zt;
int t;
}snake;
/*
后一个结点减去前一个结点的值为a b时,记为cd
a b c d
1 0 0 0
-1 0 0 1
0 1 1 0
0 -1 1 1
*/ bool check_fail(Snake s,int nx,int ny)
{
// cout<<"check point "<<s.x<<" "<<s.y<<" ZT";
// show(s.zt);
// cout<<endl;
int prex = s.x;
int prey = s.y; int w = (1<<((k-2)*2));
int t = k - 1;
while(t--){
int cx = (s.zt/w)/2;
int cy = (s.zt/w)%2;
s.zt%=w; // cout<<"cx "<<cx<<" cy "<<cy<<endl;
int x = prex;
int y = prey; if(cx == 0 && cy == 0) x+=1;
if(cx == 0 && cy == 1) x-=1;
if(cx == 1 && cy == 0) y+=1;
if(cx == 1 && cy == 1) y-=1;
prex = x;
prey = y; if(x == nx && y == ny) return true; w>>=2;
} return false;
} void bfs(Snake s)
{
queue<Snake> Q;
Q.push(s);
vis[s.x][s.y][s.zt] = 1; while(!Q.empty()){
if(ans != -1){
break;
}
Snake now = Q.front();
Q.pop();
// cout<<"Now "<<now.x<<" "<<now.y<<" ZT"<<now.zt<<" t"<<now.t<<endl; for(int i = 0; i < 4; i++){
int x = now.x - dx[i];
int y = now.y - dy[i];
int zt = now.zt>>2; if(dx[i] == 1 && dy[i] == 0) zt += (0<<((k-2)*2));
if(dx[i] == -1 && dy[i] == 0) zt += (1<<((k-2)*2));
if(dx[i] == 0 && dy[i] == 1) zt += (2<<((k-2)*2));
if(dx[i] == 0 && dy[i] == -1) zt += (3<<((k-2)*2)); Snake tmp;
tmp.x = x,tmp.y = y,tmp.zt = zt,tmp.t = now.t+1; if(x<1 || x>n || y<1 || y>m || vis[x][y][zt] || stone[x][y]) continue;
if(check_fail(now,x,y)) continue; vis[x][y][zt] = 1; if(x == 1 && y == 1){
ans = tmp.t;
break;
}
Q.push(tmp);
}
}
} int main()
{
// freopen("in.txt","r",stdin);
int cnt = 0;
while(scanf("%d%d%d",&n,&m,&k)){
cnt++;
if(n == 0 && m == 0 && k == 0) break;
CLR(vis,0);
CLR(stone,0);
snake.zt = 0;
snake.t = 0;
ans = -1; scanf("%d%d",&snake.x,&snake.y);
int prex = snake.x;
int prey = snake.y;
for(int i = 1; i < k; i++){
int x,y;
scanf("%d%d",&x,&y);
int cx = x - prex;
int cy = y - prey;
prex = x;
prey = y; snake.zt<<=2;
if(cx == 1 && cy == 0) snake.zt += 0;
if(cx == -1 && cy == 0) snake.zt += 1;
if(cx == 0 && cy == 1) snake.zt += 2;
if(cx == 0 && cy == -1) snake.zt += 3;
} int l;
scanf("%d",&l);
for(int i = 1; i <= l; i++){
int x,y;
scanf("%d%d",&x,&y);
stone[x][y] = 1;
} bfs(snake);
if(snake.x == 1 && snake.y == 1) printf("Case %d: %d\n",cnt,0);
else printf("Case %d: %d\n",cnt,ans);
}
return 0;
}

POJ 1324 Holedox Moving (状压BFS)的更多相关文章

  1. POJ - 1324 Holedox Moving (状态压缩+BFS/A*)

    题目链接 有一个n*m(1<=n,m<=20)的网格图,图中有k堵墙和有一条长度为L(L<=8)的蛇,蛇在移动的过程中不能碰到自己的身体.求蛇移动到点(1,1)所需的最小步数. 显然 ...

  2. poj 1324 Holedox Moving

    poj 1324 Holedox Moving 题目地址: http://poj.org/problem?id=1324 题意: 给出一个矩阵中,一条贪吃蛇,占据L长度的格子, 另外有些格子是石头, ...

  3. POJ 1324 Holedox Moving 搜索

    题目地址: http://poj.org/problem?id=1324 优先队列---A*的估价函数不能为蛇头到(1,1)的距离,这样会出错. 看了discuss,有大神说这题A*的估价函数为BFS ...

  4. 拯救大兵瑞恩 HDU - 4845(状压bfs || 分层最短路)

    1.状压bfs 这个状压体现在key上  我i们用把key状压一下  就能记录到一个点时 已经拥有的key的种类 ban[x1][y1][x2][y1]记录两个点之间的状态 是门 还是墙 还是啥都没有 ...

  5. P2622 关灯问题II(状压bfs)

    P2622 关灯问题II 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j] ...

  6. HDU 4012 Paint on a Wall(状压+bfs)

    Paint on a Wall Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) ...

  7. HDU Stealing Harry Potter's Precious(状压BFS)

    状压BFS 注意在用二维字符数组时,要把空格.换行处理好. #include<stdio.h> #include<algorithm> #include<string.h ...

  8. 状压BFS

    ​题意:1个机器人找几个垃圾,求出最短路径. 状压BFS,这道题不能用普通BFS二维vis标记数组去标记走过的路径,因为这题是可以往回走的,而且你也不能只记录垃圾的数量就可以了,因为它有可能重复走同一 ...

  9. POJ 3254 Corn Fields (状压dp)

    题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...

随机推荐

  1. 四十九、进程间通信——System V IPC 之消息队列

    49.1 System V IPC 介绍 49.1.1 System V IPC 概述 UNIX 系统存在信号.管道和命名管道等基本进程间通讯机制 System V 引入了三种高级进程间通信机制 消息 ...

  2. [译]Ocelot - Claims Transformation

    原文 用户授权后才能使用此功能. 用户获得授权后claims将被发送到claims transformation中间件.用户授权后,我们首先调用claims to headers middleware ...

  3. 拆系数FFT及其部分优化

    模拟考某题一开始由于校内OJ太慢直接拆系数FFT跑不过 后来被神仙婊了一顿之后发现复杂度写炸了改了改随便过 模版题:任意模数NTT 三模数NTT 常数巨大,跑的极慢 拆系数FFT 原理是对于两个多项式 ...

  4. 设计模式四: 抽象工厂(Abstract Factory)

    简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象 ...

  5. Beta冲刺(4/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(4/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 ppt模板 接下来的计划 做好机动. ...

  6. 【原创】大数据基础之ElasticSearch(2)常用API整理

    Fortunately, Elasticsearch provides a very comprehensive and powerful REST API that you can use to i ...

  7. iOS URL Cache文章推荐 (待完成)

    推荐链接是:http://www.cnblogs.com/Mike-zh/archive/2016/02/24/5210169.html http://blog.csdn.net/y550918116 ...

  8. SSH总结

    远程服务介绍说明 SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输.确保了数据传输安全.那SSH服务主要功能有哪些呢?1.提供远程连接服务器的服务2.对传输的数据进 ...

  9. html form action

    action 行为 一.j_security_check  登陆检查 <!DOCTYPE html> <html> <head> <meta charset= ...

  10. 利用CSS3实现鼠标悬停在图片上图片缓慢缩放的两种方法

    1.改变background-size属性 将图片作为某个html元素的背景图片,用transition属性改变图片的大小. .container{ background-size: 100% 100 ...