青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

oyjpArt ACM/ICPC算法程序設計空間

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6

Finding Nemo

Posted on 2007-01-14 01:58 oyjpart 閱讀(1362) 評論(2)  編輯 收藏 引用 所屬分類: ACM/ICPC或其他比賽

Finding Nemo
Time Limit:2000MS? Memory Limit:30000K
Total Submit:1965 Accepted:370

Description
Nemo is a naughty boy. One day he went into the deep sea all by himself. Unfortunately, he became lost and couldn't find his way home. Therefore, he sent a signal to his father, Marlin, to ask for help.
After checking the map, Marlin found that the sea is like a labyrinth with walls and doors. All the walls are parallel to the X-axis or to the Y-axis. The thickness of the walls are assumed to be zero.
All the doors are opened on the walls and have a length of 1. Marlin cannot go through a wall unless there is a door on the wall. Because going through a door is dangerous (there may be some virulent medusas near the doors), Marlin wants to go through as few doors as he could to find Nemo.
Figure-1 shows an example of the labyrinth and the path Marlin went through to find Nemo.


We assume Marlin's initial position is at (0, 0). Given the position of Nemo and the configuration of walls and doors, please write a program to calculate the minimum number of doors Marlin has to go through in order to reach Nemo.

Input
The input consists of several test cases. Each test case is started by two non-negative integers M and N. M represents the number of walls in the labyrinth and N represents the number of doors.
Then follow M lines, each containing four integers that describe a wall in the following format:
x y d t
(x, y) indicates the lower-left point of the wall, d is the direction of the wall -- 0 means it's parallel to the X-axis and 1 means that it's parallel to the Y-axis, and t gives the length of the wall.
The coordinates of two ends of any wall will be in the range of [1,199].
Then there are N lines that give the description of the doors:
x y d
x, y, d have the same meaning as the walls. As the doors have fixed length of 1, t is omitted.
The last line of each case contains two positive float numbers:
f1 f2
(f1, f2) gives the position of Nemo. And it will not lie within any wall or door.
A test case of M = -1 and N = -1 indicates the end of input, and should not be processed.

Output
For each test case, in a separate line, please output the minimum number of doors Marlin has to go through in order to rescue his son. If he can't reach Nemo, output -1.

Sample Input

8 9
1 1 1 3
2 1 1 3
3 1 1 3
4 1 1 3
1 1 0 3
1 2 0 3
1 3 0 3
1 4 0 3
2 1 1
2 2 1
2 3 1
3 1 1
3 2 1
3 3 1
1 2 0
3 3 0
4 3 1
1.5 1.5
4 0
1 1 0 1
1 1 1 1
2 1 1 1
1 2 0 1
1.5 1.7
-1 -1

Sample Output

5
-1

第一次用priority_queue 發現效率還不錯~
居然1y了 很是驚訝的說 rp突然好起來了?
我是從Nemo向Marlin搜索的 采用優先隊列的方式就能找到最少的過門方式
細節部分還是要注意~~
Solution:
//by Optimistic
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
const int MAXINT = 2000000000;
const int N = 210;
struct Point{int x, y, p;}; //坐標,權值(經過門的個數)
bool wall[N][N][2], door[N][N][2], end[N][N], seted[N][N]; //墻壁,門,可直達點,標記
Point start;????????????????? //起點(Nemo)
int nw, nd, xh, yh;?????????? //墻的個數,門的個數,x的最高值,y的最高值(限定搜索范圍)
struct cmp
{
public: inline bool operator()(const Point& a, const Point& b) ?{return a.p > b.p;}
};
priority_queue <Point, vector<Point>, cmp> pq; //優先隊列
void set_end(int x, int y) //設置可直達點(不通過任何門)
{
?end[x][y] = 1;
?if(x-1 <= xh && x-1 >= 0 && y <= yh && y >= 0 && wall[x][y][1] == 0?
??&& door[x][y][1] == 0 && !end[x-1][y])???set_end(x-1, y);
?if(x <= xh && x >= 0 && y-1 <= yh && y-1 >= 0 && wall[x][y][0] == 0
??&& door[x][y][0] == 0 && !end[x][y-1])???set_end(x, y-1);
?if(x+1 <= xh && x+1 >= 0 && y <= yh && y >= 0 && wall[x+1][y][1] == 0
??&& door[x+1][y][1] == 0 && !end[x+1][y])??set_end(x+1, y);
?if(x <= xh && x >= 0 && y+1 <= yh && y+1 >= 0 && wall[x][y+1][0] == 0
??&& door[x][y+1][0] == 0 && !end[x][y+1])??set_end(x, y+1);
}?
void init()
{
?int i, x, y, d, t, j;
?double dx, dy;
?memset(wall, 0, sizeof(wall));
?memset(door, 0, sizeof(door));
?memset(end, 0, sizeof(end));
?yh = -MAXINT; xh = -MAXINT;
?for(i = 0; i<nw; i++) {
??scanf("%d%d%d%d", &x, &y, &d, &t);
??if(x > xh) xh = x;
??if(y > yh) yh = y;
??if(d == 0) {
???for(j = 0; j<t; j++) {
????wall[x+j][y][0] = 1;
???}
??}
??else {
???for(j = 0; j<t; j++) {
????wall[x][y+j][1] = 1;
???}
??}
?}
?for(i = 0; i<nd; i++) {
??scanf("%d%d%d", &x, &y, &d);
??if(x > xh) xh = x;
??if(y > yh) yh = y;
??door[x][y][d] = 1;
??wall[x][y][d] = 0;??? //門要把墻覆蓋 sample中可以看出來
?}
?cin >> dx >> dy;
?start.x = (int)dx, start.y = (int)dy, start.p = 0; //設置起點 初始化權值為0
?memset(seted, 0, sizeof(seted));
?set_end(0, 0); //設置可直達點(不通過任何門)
?yh++; xh++;
}
void work()
{
?if(start.x < 0 || start.x >= 200 || start.y < 0 || start.y >= 200 || xh <0 || yh <0)? //特殊情況
?{?printf("0\n");??return ;?}
?memset(seted, 0, sizeof(seted));
?while(!pq.empty()) pq.pop();
?pq.push(start);??????????????????????? //起點入列
?seted[start.x][start.y] = 1;
?while(!pq.empty()) {
??Point cur = pq.top();????????????? //取權值最大的點
??pq.pop();
??if(end[cur.x][cur.y] == 1) { printf("%d\n", cur.p); return;} //找到解
??int x= cur.x, y = cur.y;
??Point now;
??if(x-1 <= xh && x-1 >= 0 && y <= yh && y >= 0 && wall[x][y][1] == 0 && !seted[x-1][y]) { //左搜索
???if(door[x][y][1] == 1) now.p = cur.p + 1;
???else now.p = cur.p;
???now.x = x -1;???now.y = y;
???pq.push(now);
??}
??if(x <= xh && x >= 0 && y - 1 <= yh && y-1 >= 0 && wall[x][y][0] == 0 && !seted[x][y-1]) { //下搜索
???if(door[x][y][0] == 1) now.p = cur.p + 1;
???else now.p = cur.p;
???now.x = x;???now.y = y-1;
???pq.push(now);
???seted[now.x][now.y] = 1;
??}
??if(x+1 <= xh && x+1 >= 0 && y <= yh && y >= 0 && wall[x+1][y][1] == 0 && !seted[x+1][y]) { //右搜索
???if(door[x+1][y][1] == 1) now.p = cur.p + 1;
???else now.p = cur.p;
???now.x = x + 1;???now.y = y;
???pq.push(now);
???seted[now.x][now.y] = 1;
??}
??if(x <= xh && x >= 0 && y+1 <= yh && y+1 >= 0 && wall[x][y+1][0] == 0 && !seted[x][y+1]) { //上搜索
???if(door[x][y+1][0] == 1) now.p = cur.p + 1;
???else now.p = cur.p;
???now.x = x;???now.y = y+1;
???pq.push(now);
???seted[now.x][now.y] = 1;
??}
?}
?printf("-1\n"); //無解
}
int main()
{
?while(scanf("%d %d", &nw, &nd), !(nw == -1 && nd == -1)) {
??init();
??work();
?}
?return 0;
}

Feedback

# re: Finding Nemo  回復  更多評論   

2008-12-08 17:42 by lala
拉拉,你左搜索忘標記啦

# re: Finding Nemo  回復  更多評論   

2008-12-09 12:50 by alpc12
好像是啊。。。汗。。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99精品久久久| 亚洲自啪免费| 欧美成人精品一区| 久久久久网站| 亚洲欧洲精品成人久久奇米网| 欧美成va人片在线观看| 欧美成人精品一区二区三区| 亚洲人成网站影音先锋播放| 亚洲精品你懂的| 美玉足脚交一区二区三区图片| 伊人成年综合电影网| 欧美刺激午夜性久久久久久久| 欧美成人精品h版在线观看| 一区二区电影免费观看| 亚洲视频在线观看一区| 国产综合久久| 亚洲福利视频在线| 国产精品久久久久av| 久久精品免视看| 免费久久99精品国产自在现线| 99re热精品| 亚洲欧美一区二区精品久久久| 韩国三级电影一区二区| 亚洲国产精品女人久久久| 国产精品v欧美精品v日本精品动漫| 欧美在线一级视频| 免费成人黄色片| 亚洲影视九九影院在线观看| 久久精品国产清高在天天线| 日韩视频一区二区在线观看 | 久久精品动漫| 欧美高清hd18日本| 欧美亚洲午夜视频在线观看| 免费高清在线一区| 午夜精品久久久久久久久| 久久九九国产精品怡红院| 亚洲精品在线二区| 亚洲欧美日韩中文视频| 亚洲美女福利视频网站| 久久www免费人成看片高清| 99re6这里只有精品视频在线观看| 亚洲免费在线观看视频| av成人免费在线| 久久久久久久999精品视频| 亚洲一区二区日本| 美女黄色成人网| 久久久午夜视频| 国产精品国产自产拍高清av| 亚洲国产精品久久久久久女王| 国产一区二区三区四区| 一区二区三区国产| 日韩视频在线你懂得| 久久天堂av综合合色| 久久久99爱| 国产欧美高清| 亚洲一区二区av电影| 99综合电影在线视频| 久久夜色精品国产噜噜av| 久久久国产一区二区| 国产精品嫩草99a| 中文欧美字幕免费| 亚洲网站啪啪| 欧美午夜大胆人体| 亚洲免费观看视频| 99精品99| 欧美日韩精品不卡| 日韩性生活视频| 亚洲视频播放| 欧美午夜电影在线| 亚洲欧美经典视频| 欧美一区二区三区另类| 国产日韩欧美视频| 性色av一区二区三区红粉影视| 欧美一级片在线播放| 国产精品一区二区a| 亚洲综合电影一区二区三区| 午夜国产欧美理论在线播放 | 久久综合国产精品台湾中文娱乐网| 久久久免费av| 亚洲国产另类久久久精品极度| 久久全球大尺度高清视频| 亚洲电影免费| 日韩一二三在线视频播| 欧美日韩国产a| 亚洲在线黄色| 久久亚洲综合色| 亚洲精选视频在线| 国产精品久久久久毛片大屁完整版| 亚洲一区激情| 欧美成人黄色小视频| 亚洲国产一区二区三区a毛片 | 欧美一区二区免费视频| 久久久天天操| 亚洲最新视频在线播放| 国产精品区二区三区日本| 久久大逼视频| 亚洲激情第一区| 欧美一级视频一区二区| 亚洲第一区在线观看| 欧美日韩精品免费| 欧美一区二区三区四区在线 | 亚洲综合好骚| 悠悠资源网亚洲青| 欧美视频观看一区| 久久一区欧美| 亚洲一区视频在线观看视频| 美女在线一区二区| 亚洲欧美日韩国产综合在线 | 国产精品一区二区三区观看| 久久男人资源视频| 一区二区三区你懂的| 免费日韩av电影| 亚洲欧美日韩另类| 亚洲精品免费在线观看| 国产亚洲成av人在线观看导航 | 欧美91大片| 亚洲欧美在线一区| 亚洲精品小视频| 免费观看在线综合| 欧美中文在线视频| 亚洲校园激情| 亚洲区欧美区| 狠狠噜噜久久| 国产午夜亚洲精品理论片色戒| 欧美日韩八区| 免费观看国产成人| 久久国产日韩欧美| 亚洲一区二区三区欧美| 亚洲日韩欧美视频一区| 欧美成人国产va精品日本一级| 性久久久久久| 亚洲一区二区三区精品在线| 亚洲精选91| 亚洲精品综合| 亚洲精品资源| 亚洲精品中文字幕有码专区| 亚洲激情网站| 91久久精品美女高潮| 亚洲高清视频一区| 亚洲观看高清完整版在线观看| 国语自产偷拍精品视频偷| 国产亚洲精品久久久久婷婷瑜伽| 国产精品美女xx| 国产精品久久久久久久7电影| 欧美三级资源在线| 国产精品久久网站| 国产精品视频导航| 国产欧美精品日韩区二区麻豆天美| 国产精品久久久久久久久借妻 | 国产精品成人午夜| 国产精品第2页| 国产精品激情| 国产伦理一区| 国产综合久久久久久| 国产一区二区av| 黄色亚洲网站| 在线精品高清中文字幕| 91久久夜色精品国产九色| 亚洲国语精品自产拍在线观看| 91久久久国产精品| 日韩亚洲在线| 午夜综合激情| 久久综合狠狠综合久久综合88| 免费高清在线一区| 亚洲激情成人在线| 一区二区日韩伦理片| 亚洲欧美自拍偷拍| 久久久久久香蕉网| 欧美久久久久久蜜桃| 国产精品成人在线观看| 国产亚洲精品久久久久婷婷瑜伽| 国外成人网址| 99ri日韩精品视频| 欧美一区二区三区视频在线观看| 久久香蕉国产线看观看网| 亚洲国产婷婷香蕉久久久久久99 | 欧美激情精品| 日韩视频一区二区三区| 亚洲欧美电影院| 麻豆国产精品777777在线| 欧美日韩一区二区在线| 狠狠色伊人亚洲综合成人| 亚洲精品综合精品自拍| 欧美亚洲系列| 亚洲三级视频在线观看| 午夜精品视频在线| 欧美精品一区二区三| 狠狠狠色丁香婷婷综合激情| 99精品欧美一区二区三区| 久久久久综合网| 一区二区三区高清在线观看| 久久综合网络一区二区| 欧美亚韩一区| 日韩一级不卡| 欧美va天堂| 欧美在线观看视频在线| 国产精品乱码一区二三区小蝌蚪| 18成人免费观看视频| 久久精品电影| 亚洲一区www|