2534: The Hero Rescued The Princess

2023-10-17 21:30
文章标签 hero 2534 rescued princess

本文主要是介绍2534: The Hero Rescued The Princess,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2534: The Hero Rescued The Princess


ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE
3s65536K30892Standard

美丽的公主被关在古老的施了咒语的城堡中,你作为当今世上最勇敢的英雄,决定救出这位美丽的公主。
如果你成功了,最后公主就会嫁给你。当然故事有点俗套,至少如果你把她救出了,我会免费送你一个气球。
但是有很多的英雄去救,如果别人在你之前把公主救了,那么公主可就不属于你了。所以你一定要加快行动,现在就向目标进发吧。
这个城堡的地图由一个(15*30)的字符矩阵构成,我们可以保证矩阵是封闭的。
城堡中有很多的小怪,当然这对于武功高强你的一定不成问题,但你你需要比平时多用一天的时间。
字符有:
'#',表示城堡的墙,你不可以穿过;
'.',表示空地,你需要花费一天的时间走过。
'M',表示此地有怪,你需要两天的时间走过。
'S',表示你的初始地点
'T',表示公主的所在地
首行会有一个整数n(n<=10),表示后面有多少个迷宫,每个城堡由(15*30) 的矩阵构成,
每个城堡有且仅有一个S和T,现在你需要设计合适的路线保证总是尽量早的到公主的地方。
如果没有路线可以救出公主,输出-1;
你只能向上,向下,向左或向右走,但不可以斜着走。

Sample input

1
##############################
#.S#.........................#
#..#.........................#
#...MT.......................#
#.#..........................#
#............................#
#............................#
#............................#
#............................#
#............................#
#............................#
#............................#
#............................#
#............................#
##############################

Sample output

6

Problem Source: Keenas


This problem is used for contest: 124 



Submit / Problem List / Status / Discuss

这道题既可以用DFS做,也可以用BFS做。用BFS时可以用数组模拟队列,若不用数组,就直接用优先级队列做,但要注意优先级队列中的cmp要自己写。因为有+1和+2两种情况,所以要使+1先入队列,+2后入,再往下一层搜。
这里主要写一下BFS的代码。注意优先级队列用的是小顶堆。
BFS:
#include<cstdio>
#include<queue>
using namespace std;
char map[16][31];
bool vis[16][31];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
bool flag;
int s_x,s_y,e_x,e_y;//初始位置和目标位置
int res;
struct node
{
    int x;
    int y;
    int step;
};
struct cmp//自定义优先级,这个要记住
{
    bool operator()(const node&t1,const node&t2)
    {
        return t1.step>t2.step;
    }
};
priority_queue <node,vector<node>,cmp> q;
void bfs(int x,int y)//其他的都和BFS一样了。和之前一个类似1313(类似迷宫)的代码差不多
{
    node temp,temp1;
    temp.x=x;
    temp.y=y;
    temp.step=0;
    vis[x][y]=true;
    q.push(temp);
    while(!q.empty())
    {
        temp1=q.top();//优先级队列队顶的元素用top!!
        q.pop();
        if(temp1.x==e_x&&temp1.y==e_y)
        {
            flag=true;
            res=temp1.step;
            break;
        }
        else
        {
            for(int i=0;i<4;i++)
            {
                int fx=temp1.x+dx[i];
                int fy=temp1.y+dy[i];
                if(fx>=0&&fx<15&&fy>=0&&fy<30&&map[fx][fy]!='#'&&!vis[fx][fy])
                {
                    vis[fx][fy]=true;
                    temp.x=fx;
                    temp.y=fy;
                    if(map[fx][fy]=='M')//可以写一起了。使用优先级队列
                    temp.step=temp1.step+2;
                    else
                    temp.step=temp1.step+1;
                    q.push(temp);
                }
            }
        }
    }
}
int main()
{
    int n;
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    scanf("%d",&n);
        while(n--)
        {
            while(!q.empty())
            {
                q.pop();
            }
            res=0;
            flag=false;
            for(int i=0;i<15;i++)
            for(int j=0;j<30;j++)
            {
                scanf(" %c",&map[i][j]);
                vis[i][j]=false;
                if(map[i][j]=='S')
                {
                    s_x=i;
                    s_y=j;
                }
                if(map[i][j]=='T')
                {
                    e_x=i;
                    e_y=j;
                }
            }
            bfs(s_x,s_y);
            if(flag)
            printf("%d\n",res);
            else
            printf("-1\n");
        }
    return 0;
}
 */
#include<stdio.h>
#define MAX 1000;
int visit[15][30],hav,mini;
int map[15][30];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
void dfs(int x,int y,int time)
{
 int i;
 visit[x][y]=time;
 if(time>mini)
  return;
 if(map[x][y]=='T')
 { if(time<mini)
  {
   mini=time;
   hav=1;
  
  }
  return;
 }
 for(i=0;i<4;i++)
 {
  if(map[x+dx[i]][y+dy[i]]=='#')continue;
     if(map[x+dx[i]][y+dy[i]]=='M')
  {
   if(visit[x+dx[i]][y+dy[i]]>time+2)
   dfs(x+dx[i],y+dy[i],time+2);
  }
  
  else
  { if(visit[x+dx[i]][y+dy[i]]>time+1)
    dfs(x+dx[i],y+dy[i],time+1);
  }
 
 }
}
int main()
{
 int n,i,j,posx,posy;
 scanf("%d",&n);
 getchar();
 
 while(n--)
 {
  for(i=0;i<15;i++)
  {
   for(j=0;j<30;j++)
   {
    visit[i][j]=MAX;
    map[i][j]=getchar();
    if(map[i][j]=='S')
    {
     posx=i;posy=j;
    }
   }
   getchar();
  }
  hav=0;mini=MAX;
  dfs(posx,posy,0);
  printf("%d\n",hav?mini:-1);
 }
 return 0;
}

这篇关于2534: The Hero Rescued The Princess的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/228061

相关文章

2534. 乘方 [CSP-J 2022]

代码 #include<bits/stdc++.h>using namespace std;int main(){long long n,m,i,sum=1;cin>>n>>m;for(i=1;i<=m;i++){sum*=n;if(sum>1000000000){cout<<-1;return 0;;}}cout<<sum;return 0;} 记得点赞+关注+收藏!!!谢谢!!!

angular的hero例子(3)

就是把detail放在另一个组件里 ng generate component hero-detail 代码: heroes.component.ts import { Component, OnInit } from '@angular/core';import { Hero } from '../hero';@Component({selector: 'app-heroes',

angular的hero例子(2)

展示多个英雄 *ngfor的使用 代码: heroes.component.ts import { Component, OnInit } from '@angular/core';import { Hero } from '../hero';@Component({selector: 'app-heroes',templateUrl: './heroes.component.htm

HDU Ignatius and the Princess IV

题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1029 看来写这类题目必须要创新的思路,纯粹的写循环很容易被大数据爆掉。下面是一份超时代码,目前还没有发现原因,没有死循环,目测是数据量大的原因? #include<stdio.h>#include<string.h>#include<algorithm>//#define LOCAL

uva 10635 - Prince and Princess(LCS)

题目连接:10635 - Prince and Princess 题目大意:给出n, m, k,求两个长度分别为m + 1 和 k + 1且由1~n * n组成的序列的最长公共子序列长的。 解题思路:按一般的o(n^2)的算法超时了,所以上网查了下LCS装换成LIS的算法o(nlogn)。算法仅仅是将其中的一个序列重新标号1~m,然后按最长公共子序列的方法去做。 #in

Modular RPG Hero PBR

-掩码着色着色器提供了无限的颜色变化。(适用于标准/HDRP/URP 11.0.0) -为剑与盾/双剑/双剑姿态提供了简单的角色控制器。(不包括弓和魔杖控制器)(它是用旧的输入系统建造的) -HDRP/URP(11.0.0)SRP 100%支持常规着色器和遮罩着色着色器(基于着色器图形) -具有许多模块化部件和武器,可高度定制(有关详细信息,请查看屏幕截图) -针对手机游戏进行了优化(低多边形

1006: Hero In Maze

题目描述 500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他知道公主在迷宫中还能坚持T天,他急忙赶到迷宫,开始到处寻找公主的下落。 时间一点一点的过去,Jesse还是无法找到公主。最后当他找到公主的时候,美丽的公主已经死了。从此Jesse郁郁寡欢,茶饭不思,一年后追随

杭电OJ 1027:Ignatius and the Princess II

题目的大意就是求一串数字的全排列的第m小的排列,比如1,2,3是3个数的最小的全排列,1,3,2是次小的全排列。这个题目可以用STL的一个函数next_permutation,这个函数是用来生成一个全排列的下一个全排列,当然也可以自己写生成排列算法,生成一个全排列的下一个全排列的算法如下: (1)从数组最后一个开始往前找,假设后一个记为p,前一个记为pre,直到找到一个满足A[pre]<A[p]

SwiftUI 解决英雄(Hero)动画导致“图片墙”点击切换时卡顿唐突的问题

问题现象 从 SwiftUI 2.0 开始,苹果通过 matchedGeometryEffect 修改器方法新增了对英雄动画(Hero Animation)的支持,这立即使得 SwiftUI 动画表现力提升了一个新级别。“英雄”虽好,不过倘若使用不当也会造成“诡异”的效果: 如上图所示,我们利用 Hero 动画呈现的图片墙感觉极其卡顿而且在动画元素衔接上非常不协调。这是“肿”么回事?又

大数据24小时:英特尔中国研究院发布HERO机器人平台,新华三与南京市共建智慧教育云

英特尔中国研究院正式发布HERO机器人平台;新华三与南京教育局合作,共同打造智慧教育云;帮助软件实现数据分析的自动化,Qubole获2500万美元融资……以下为您奉上更多大数据热点事件 编辑 | abby 官网 | www.datayuan.cn 微信公众号ID | datayuancn 一、英特尔中国研究院正式发布HERO机器人平台 据媒体报道,英特尔中国研究院于今日早晨正式对外