红衣男孩(bfs)

题目链接:here

算是将近一年前的题了=_=

终于知道自己之前一直错在哪了。。。

跟普通的bfs求最短路不一样的是,没有限制每个格子只能走一次~

这个题就像是堆优化的dijkstra一样~

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1010;
 4 const int inf=0x3f3f3f3f;
 5 int dir[4][2]={1,0,0,1,-1,0,0,-1};
 6 int p[maxn][maxn];
 7 int d[maxn][maxn];
 8 int money[maxn][maxn];
 9 int n,m;
10 int sx,sy,ex,ey;
11 struct Node{
12     int x,y;
13     int my,st;
14 }a,b;
15 int my,st;
16 void bfs(){
17     queue<Node> q;
18     memset(money,0,sizeof(money));
19     memset(d,inf,sizeof(d));
20     d[sx][sy]=0;
21     money[sx][sy]=p[sx][sy];
22     a.my=p[sx][sy];
23     a.st=0;
24     a.x=sx;a.y=sy;
25     q.push(a);
26     while(!q.empty()){
27         a=q.front();
28         q.pop();
29         if(a.st>st) break;
30         if(a.x==ex&&a.y==ey){
31             if(a.st<st||a.st==st&&a.my>my){
32                 st=a.st;
33                 my=a.my;
34             }
35             continue;
36         }
37         if(d[a.x][a.y]<a.st||d[a.x][a.y]==a.st&&money[a.x][a.y]>a.my) continue;
38         for(int i=0;i<4;i++){
39             b.x=a.x+dir[i][0];
40             b.y=a.y+dir[i][1];
41             if(b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&p[b.x][b.y]!=-1){
42                 b.my=a.my+p[b.x][b.y];
43                 b.st=a.st+1;
44                 if(d[b.x][b.y]<b.st||d[b.x][b.y]==b.st&&money[b.x][b.y]>=b.my) continue;  //只漏了一个等号就MLE=_=
45                 d[b.x][b.y]=b.st;
46                 money[b.x][b.y]=b.my;
47                 q.push(b);
48             }
49         }
50     }
51 }
52 int main(){
53     int t;
54     scanf("%d",&t);
55     while(t--){
56        scanf("%d%d",&n,&m);
57        scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
58        sx--;sy--;ex--;ey--;
59        for(int i=0;i<n;i++)
60             for(int j=0;j<m;j++)
61                 scanf("%d",&p[i][j]);
62        my=-1;
63        st=inf;
64        bfs();
65        printf("%d\n",my);
66     }
67 }

时间: 2024-10-24 06:36:19

红衣男孩(bfs)的相关文章

爬取猫眼电影

爬去猫眼电影正字热映电影榜单的前五页: #爬取猫眼电影正在热映前5面的所有电影 import requests from requests import RequestException import re def get_one_page(url): header ={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.8

HDU-3085-Nightmare Ⅱ(双向BFS)

Problem Description Last night, little erriyue had a horrible nightmare. He dreamed that he and his girl friend were trapped in a big maze separately. More terribly, there are two ghosts in the maze. They will kill the people. Now little erriyue want

噩梦(双向BFS)

给定一张N*M的地图,地图中有1个男孩,1个女孩和2个鬼. 字符“.”表示道路,字符“X”表示墙,字符“M”表示男孩的位置,字符“G”表示女孩的位置,字符“Z”表示鬼的位置. 男孩每秒可以移动3个单位距离,女孩每秒可以移动1个单位距离,男孩和女孩只能朝上下左右四个方向移动. 每个鬼占据的区域每秒可以向四周扩张2个单位距离,并且无视墙的阻挡,也就是在第k秒后所有与鬼的曼哈顿距离不超过2k的位置都会被鬼占领. 注意: 每一秒鬼会先扩展,扩展完毕后男孩和女孩才可以移动. 求在不进入鬼的占领区的前提下,

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

BFS+康托展开(洛谷1379 八数码难题)

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据) 输入样例#1: 2831

Sicily 1444: Prime Path(BFS)

题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 bool isPrime(int n){//素数判断 5 if(n == 2 || n == 3) return true; 6 else{ 7 int k = sqrt(n) + 1; 8 for(int i = 2; i < k; i

HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 524    Accepted Submission(s): 151 Problem Description TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams abou

POJ3967Ideal Path[反向bfs 层次图]

Ideal Path Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 1754   Accepted: 240 Description New labyrinth attraction is open in New Lostland amusement park. The labyrinth consists of n rooms connected by m passages. Each passage is colo

胜利大逃亡(续)(状态压缩bfs)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7357    Accepted Submission(s): 2552 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带