Dirt HDU - 3023 题解

来源:互联网 发布:短信猫测试软件 编辑:程序博客网 时间:2024/06/06 15:37

– Hello, may I speak to Petrov, please? Hello, my darling… You know, there was a little accident at our home… No, no, don’t worry, your computer was not damaged. It is only a bit dirty there now. Well, I should say it’s very dirty there and I’m at my Mom’s now. Of course, I’ll clean it… When? Well, maybe when I have my vacation. What? Well, when we are back from Turkey… the next vacation then. I’ll stay at Mother’s until then, and you may live here also. No, no, I don’t insist, sure, you may stay at home if you wish so. I prepared boots for you, they are at the door. But please, don’t make it worse, before you step on a clean floor, change your boots, put on your slippers, they are at the door also. Take them with you when you walk through the dirt. And when you walk on a clean floor, take the boots with you. You see, the dirt is in different places. OK, my love? Thank you!

It is not a great pleasure to change boots each time you get from a clean floor to a dirty floor and vice versa, it’s easier to walk extra several meters. So it is necessary to find a way of getting from one place in the apartment to another with the minimal possible number of boots changes; and among these paths the shortest one must be found.

To begin with, it is natural to determine an optimal way of passing the Most Important Route: from the computer to the refrigerator.
Input
The first line of the input contains two integers M and N, which are dimensions of the apartment (in meters), 1 ≤ N, M ≤ 1000. The two integers in the second line are the coordinates of the computer, and the third line contains the coordinates of the refrigerator. Each of the following M lines contains N symbols; this is the plan of the apartment. On the plan, 1 denotes a clean square, 2 denotes a dirty square, and 0 is either a wall or a square of impassable dirt. It is possible to get from one square to another if they have a common vertex. When you pass from a clean square to a dirty one or vice versa, you must change shoes. The computer and the refrigerator are not on the squares marked with 0.

The upper left square of the plan has coordinates (1, 1).
Output
You should output two integers in one line separated with a space. The first integer is the length of the shortest path (the number of squares on this path including the first and the last squares) with the minimal possible number of boots changes. The second number is the number of boots changes. If it is impossible to get from the computer to the refrigerator, you should output 0 0.
Sample Input
3 7
1 1
3 7
1200121
1212020
1112021
Sample Output
8 4


一张图,从脏的地方到干净的地方或反过来都需要换鞋,求从a到b点换鞋次数最少的情况下的最小步数。
我用的优先队列懒惰入队的Dij做的,其实应该直接bfs就能做。
dij每次更新和当前点相连点到起点的最小值,这里就是枚举八方向更新最小值。

#include<iostream>#include<string.h>#include<stdio.h>#include<string>#include<vector>#include<algorithm>#include<queue>using namespace std;int n, m;int begx, begy, endx, endy;string map[1005];int dis[1005][1005];int chang[1005][1005];bool v[1005][1005];struct point{    int x, y, change, step;    bool operator < (const point& b)const{        if (change == b.change){ return step > b.step; }        return change > b.change;    }};priority_queue<point> que;int dx[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };int dy[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };void dij(){    while (!que.empty()){        point cnt = que.top();        que.pop();        v[cnt.x][cnt.y] = 1;        if (cnt.x == endx&&cnt.y == endy)break;        for (int i = 0; i < 8; i++){            point newp = { cnt.x + dx[i], cnt.y + dy[i], cnt.change, cnt.step + 1 };            if (newp.x >= 0 && newp.x < n&&newp.y >= 0 && newp.y < m&&map[newp.x][newp.y]!='0'&&v[newp.x][newp.y] == 0){                if (map[newp.x][newp.y] != map[cnt.x][cnt.y]){                    newp.change++;                }                if (newp.change < chang[newp.x][newp.y]||(newp.change==chang[newp.x][newp.y]&&newp.step<dis[newp.x][newp.y])){                    chang[newp.x][newp.y] = newp.change;                    dis[newp.x][newp.y] = newp.step;                    que.push(newp);                }            }        }    }    while (!que.empty())que.pop();}int main(){    while (~scanf("%d%d", &n, &m)){        scanf("%d%d%d%d", &begx, &begy, &endx, &endy);        begx--, begy--, endx--, endy--;        for (int i = 0; i < n; i++){            cin >> map[i];        }        memset(dis, 0x3f, sizeof(dis));        dis[begx][begy] = 1;        memset(chang, 0x3f, sizeof(chang));        chang[begx][begy] = 0;        memset(v, 0, sizeof(v));        que.push({ begx, begy, 0, 1 });        dij();        if (chang[endx][endy] == 0x3f3f3f3f){ printf("0 0\n"); }        else{ printf("%d %d\n", dis[endx][endy], chang[endx][endy]); }    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网贷要钱威胁成精神病怎么办 手机清除数据后忘了帐号密码怎么办 拼多多改了标题排名降了怎么办 16g的苹果手机内存不够怎么办 魅族手机没电关机充不进电怎么办 淘宝上买电器售后得不到处理怎么办 苏宁易购物流漏送货已签收怎么办 大件包裹快递快递员不送上楼怎么办 滴滴车主提现忘记登录密码怎么办 荣耀6玩游戏不卡但是闪退怎么办 qq扫码允许别人电脑登录怎么办 药店被举卖假药药检局没查到怎么办 苹果手机连接汽车点了不信任怎么办 装修的化妆品柜台与图纸不合怎么办 买手机邮到了是假手机怎么办 京东白条分期还款第一期逾期怎么办 快递电话留错了在派件怎么办 如果在派件途中客户电话有误怎么办 在派件途中客户电话有误怎么办 成立售电公司后供电公司怎么办 新买的洗衣机外壳坏了怎么办 京东过了7天退货怎么办 同款衣服比京东便宜怎么办 国美不让休班还不给加班钱怎么办 在国美电器买贵商品怎么办 给民俗差评老板骂你怎么办 华为p10后置摄像头调黑了怎么办 美图m6手机相机拍照模糊该怎么办 美图t8用久了卡怎么办 美图m4手机开不开机怎么办 比亚迪m6冷凝器散热不好怎么办 深圳市小汽车摇号审核没通过怎么办 扫码开门售货机拿了不给钱怎么办 预付卡办完后对方不愿退款怎么办 海尔88u52显示內存不足怎么办 京东账号绑定的手机好不用了怎么办 京东账号换手机了手机号没变怎么办 京东发票的号和手机对不起来怎么办 京东账号忘记了只有身份证怎么办啊 京东账号手机号换了忘记账号怎么办 新换的卡被注册过京东号怎么办