hdu 1072 Nightmare dfs+剪枝

来源:互联网 发布:mac下载网站推荐爱情 编辑:程序博客网 时间:2024/05/21 20:06

Problem Description
Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on him. The labyrinth has an exit, Ignatius should get out of the labyrinth before the bomb explodes. The initial exploding time of the bomb is set to 6 minutes. To prevent the bomb from exploding by shake, Ignatius had to move slowly, that is to move from one area to the nearest area(that is, if Ignatius stands on (x,y) now, he could only on (x+1,y), (x-1,y), (x,y+1), or (x,y-1) in the next minute) takes him 1 minute. Some area in the labyrinth contains a Bomb-Reset-Equipment. They could reset the exploding time to 6 minutes.

Given the layout of the labyrinth and Ignatius’ start position, please tell Ignatius whether he could get out of the labyrinth, if he could, output the minimum time that he has to use to find the exit of the labyrinth, else output -1.

Here are some rules:
1. We can assume the labyrinth is a 2 array.
2. Each minute, Ignatius could only get to one of the nearest area, and he should not walk out of the border, of course he could not walk on a wall, too.
3. If Ignatius get to the exit when the exploding time turns to 0, he can’t get out of the labyrinth.
4. If Ignatius get to the area which contains Bomb-Rest-Equipment when the exploding time turns to 0, he can’t use the equipment to reset the bomb.
5. A Bomb-Reset-Equipment can be used as many times as you wish, if it is needed, Ignatius can get to any areas in the labyrinth as many times as you wish.
6. The time to reset the exploding time can be ignore, in other words, if Ignatius get to an area which contain Bomb-Rest-Equipment, and the exploding time is larger than 0, the exploding time would be reset to 6.

Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case starts with two integers N and M(1<=N,Mm=8) which indicate the size of the labyrinth. Then N lines follow, each line contains M integers. The array indicates the layout of the labyrinth.
There are five integers which indicate the different type of area in the labyrinth:
0: The area is a wall, Ignatius should not walk on it.
1: The area contains nothing, Ignatius can walk on it.
2: Ignatius’ start position, Ignatius starts his escape from this position.
3: The exit of the labyrinth, Ignatius’ target position.
4: The area contains a Bomb-Reset-Equipment, Ignatius can delay the exploding time by walking to these areas.

Output
For each test case, if Ignatius can get out of the labyrinth, you should output the minimum time he needs, else you should just output -1.

Sample Input

3
3 3
2 1 1
1 1 0
1 1 3
4 8
2 1 1 0 1 1 1 0
1 0 4 1 1 0 4 1
1 0 0 0 0 0 0 1
1 1 1 4 1 1 1 3
5 8
1 2 1 1 1 1 1 4
1 0 0 0 1 0 0 1
1 4 1 0 1 1 0 1
1 0 0 0 0 3 0 1
1 1 4 1 1 1 1 1

Sample Output

4
-1
13

/*************************************************************************    > File Name: hdu1072.cpp    > Author:gens_ukiy     > Mail:     > Created Time: 2016年12月03日 星期六 08时50分12秒 ************************************************************************/#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstdlib>#include<climits>#include<string>#include<cstring>#include<vector>#include<set>#include<list>#include<map>int dire[4][2]={ {0,1},{1,0},{0,-1},{-1,0} };int dire2[8][2]={{-1,-1},{-1,0},{-1,1},{ 0,-1},{ 0,1},{ 1,-1},{ 1,0},{ 1,1}};#define rep(i,a,b) for(int i=(a);i<=(b);(i++))#define inf 0x3f3f3f#define ll long long#define pi acos(-1)using namespace std;int n,m;int a[10][10];int sx,sy,dx,dy;int tot;int f[10][10];//记录从(sx,sy)到当前(x,y)走的步数int g[10][10];//记录(x,y)处炸弹剩余时间void dfs(int x,int y,int step,int t){    if(x<1||x>n||y<1||y>m)return;    if(a[x][y]==0)  return;    if(t<=0 || step>tot) return;    if(a[x][y]==3){        tot=tot>step?step:tot;        return;    }    if(a[x][y]==4)        t=6;    //关键剪枝    if(step>=f[x][y]&&g[x][y]>=t) return;    //记忆化搜索    f[x][y]=step,g[x][y]=t;    rep(i,0,3){        int px=x+dire[i][0];        int py=y+dire[i][1];        dfs(px,py,step+1,t-1);    }}int main(){    std::ios::sync_with_stdio(false);    #ifndef OnlineJudge    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    #endif    int T;    cin>>T;    while(T--){        cin>>n>>m;        rep(i,1,n){            rep(j,1,m){                cin>>a[i][j];                //初始化最差情形                f[i][j]=inf;                g[i][j]=0;                if(a[i][j]==2)                    sx=i,sy=j;                else if(a[i][j]==3)                    dx=i,dy=j;            }        }        tot=inf;        dfs(sx,sy,0,6);        if(tot==inf)            cout<<-1<<endl;        else            cout<<tot<<endl;    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3岁宝宝不爱刷牙怎么办 2岁宝宝不刷牙怎么办 二岁宝宝牙不好怎么办 小孩一刷牙就吐怎么办 孩子一刷牙就吐怎么办 两岁宝宝闹人怎么办 3岁宝宝不愿意刷牙怎么办 孩子牙没掉长出新牙来了怎么办 大孩子不洗澡怎么办啊 2岁宝宝不爱洗澡怎么办 手指画颜料变干怎么办 刮画纸画错了怎么办 电脑绘的图不能扩大怎么办 华腾同步课堂忘记密码怎么办 被缝纫机针扎了怎么办 大小孩抢了孩子玩具怎么办 无锡天一初中考不进天一高中怎么办 校考一个都没过怎么办 拼音会拼不会写怎么办 20岁出头很迷茫怎么办 出了社会很迷茫怎么办 2018年现在会计工作难找怎么办 开广告店没生意怎么办 淘宝没有7天退怎么办 吃了松香的鸭子怎么办 理科生考电影专业研究生怎么办 pr导出视频很慢怎么办 8岁儿童头发稀少怎么办 八岁儿童版头发怎么办 小孩子有一块不长头发怎么办 小孩子头发上长癣怎么办 一岁多头发少怎么办 孩子头发长得慢怎么办 小孩头发长得慢怎么办 头发出油不洗头怎么办 青少年掉头发很厉害怎么办 洗了冷水头头痛怎么办 头发烫染后干枯毛躁怎么办 扎不起来的短发怎么办 发际线掉头发怎么办偏方 头上脓包掉头发怎么办