hdu2571命运【bfs】

Problem Description

穿过幽谷意味着离大魔王lemon已经无限接近了!
可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关。要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑!
可怜的yifenfei为了去救MM,义无返顾地跳进了迷宫。让我们一起帮帮执着的他吧!
命运大迷宫可以看成是一个两维的方格阵列,如下图所示:
 
yifenfei一开始在左上角,目的当然是到达右下角的大魔王所在地。迷宫的每一个格子都受到幸运女神眷恋或者痛苦魔王的诅咒,所以每个格子都对应一个值,走到那里便自动得到了对应的值。
现在规定yifenfei只能向右或者向下走,向下一次只能走一格。但是如果向右走,则每次可以走一格或者走到该行的列数是当前所在列数倍数的格子,即:如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) 其中k>1。 
为了能够最大把握的消灭魔王lemon,yifenfei希望能够在这个命运大迷宫中得到最大的幸运值。

Input

输入数据首先是一个整数C,表示测试数据的组数。
每组测试数据的第一行是两个整数n,m,分别表示行数和列数(1<=n<=20,10<=m<=1000);
接着是n行数据,每行包含m个整数,表示n行m列的格子对应的幸运值K ( |k|<100 )。

Output

请对应每组测试数据输出一个整数,表示yifenfei可以得到的最大幸运值。

Sample Input

1
3 8
9 10 10 10 10 -10 10 10
10 -11 -1 0 2 11 10 -20
-11 -11 10 11 2 10 -10 -10

Sample Output

52

思路:将三种走法分别加入队列,用book数组标记每个坐标点的幸运值,如果之后的坐标点的幸运值值大于该点,才将该点加入队列。

不过,这道题正解貌似是dp啊~

#include<stdio.h>
#include<queue>
#include<string.h>
#include<iostream>
using namespace std;
#define N 25
#define M 1100
#define inf 0x3f3f3f3f
int map[N][M],max1,ans,n,m,book[N][M];

struct node{
    int x;
    int y,w;
};
queue<node>q;
void BFS()
{
    
    struct node head,tail,now;
    int x,y,i,j,d;
    head.x = 1;
    head.y = 1;
    head.w = map[1][1];
    q.push(head);
    while(!q.empty())
    {
        head = q.front();
    //    printf("x=%d y=%d w=%d\n",head.x,head.y,head.w );
        q.pop() ;
        if(head.x == n&&head.y == m)
        {
            if(head.w > max1)
                max1 = head.w ;
        }
        now.x = head.x + 1;
        now.y = head.y ;
        now.w = head.w + map[now.x][now.y];
        if(now.x >=1 &&now.y >= 1&&now.x <=n&&now.y<=m&&book[now.x][now.y] < now.w)
        {
            book[now.x][now.y] = now.w;
            q.push(now);
        }
        now.x = head.x;
        now.y = head.y +1;
        now.w = head.w + map[now.x][now.y];
        if(now.x >=1 &&now.y >= 1&&now.x <=n&&now.y<=m&&book[now.x][now.y] < now.w)
        {
            book[now.x][now.y] = now.w;
            q.push(now);
        }
        now.x = head.x;
        for(d = 2; d <= m; d ++)
        {
            now.y = head.y*d;
            if(now.y > m)
                break;
            now.w = head.w + map[now.x][now.y];
            if(now.x >=1 &&now.y >= 1&&now.x <=n&&now.y<=m&&book[now.x][now.y] < now.w)
            {
                book[now.x][now.y] = now.w;
                q.push(now);
            }
        }
        
        
    }
    return ;
}
int main()
{
    int t,i,j;
    scanf("%d",&t);
    while(t --)
    {
        scanf("%d%d",&n,&m);
        memset(book,0,sizeof(book));
        for(i = 1; i <= n; i ++)
            for(j = 1; j <= m; j ++)
                scanf("%d",&map[i][j]);
        max1 = -inf;
        BFS();
        printf("%d\n",max1);        
    }
    return 0;
}
时间: 2024-10-26 10:49:33

hdu2571命运【bfs】的相关文章

hdu2571命运

题目: Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑! 可怜的yifenfei为了去救MM,义无返顾地跳进了迷宫.让我们一起帮帮执着的他吧! 命运大迷宫可以看成是一个两维的方格阵列,如下图所示: yifenfei一开始在左上角,目的当然是到达右下角的大魔王所在地.迷宫的每一个格子都受

hdu2571 命运 动态规划Dp

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571 Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑! 可怜的yifenfei为了去救MM,义无返顾地跳进了

HDU-2571命运

Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了!可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑!可怜的yifenfei为了去救MM,义无返顾地跳进了迷宫.让我们一起帮帮执着的他吧!命运大迷宫可以看成是一个两维的方格阵列,如下图所示: yifenfei一开始在左上角,目的当然是到达右下角的大魔王所在地.迷宫的每一个格子都受到幸运女神眷恋

HDU2571 命运 【DP】

命运 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10758    Accepted Submission(s): 3793 Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要

HDU2571:命运(简单dp)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2571 没什么好说的,不过要处理好边界. 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> #include <algorithm> #include <math.h> typed

HDU2571

命运 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16456    Accepted Submission(s): 5750 Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了!可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要知道

CSU 1726 你经历过绝望吗?两次! [BFS]

Description 4月16日,日本熊本地区强震后,受灾严重的阿苏市一养猪场倒塌,幸运的是,猪圈里很多头猪依然坚强存活.当地15名消防员耗时一天解救围困的"猪坚强".不过与在废墟中靠吃木炭饮雨水存活36天的中国汶川"猪坚强"相比,熊本的猪可没那么幸运,因为它们最终还是没能逃过被送往屠宰场的命运. 我们假设"猪坚强"被困在一个N*M的废墟中,其中"@"表示"猪坚强"的位置,"."表示可

[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