国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Dirt HDU - 3023 題解

2019-11-08 02:31:54
字體:
來源:轉載
供稿:網友

– 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;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蒲城县| 宁武县| 临邑县| 措勤县| 固安县| 昌宁县| 绥中县| 柳林县| 巴林右旗| 宣汉县| 专栏| 乌什县| 偃师市| 海安县| 诸暨市| 盖州市| 长治县| 德化县| 夏邑县| 桂阳县| 余江县| 三明市| 杂多县| 涡阳县| 永安市| 永州市| 云和县| 鄯善县| 沙坪坝区| 辰溪县| 宝坻区| 大洼县| 清水河县| 香格里拉县| 视频| 夏津县| 双柏县| 浮梁县| 衡山县| 根河市| 堆龙德庆县|