zoukankan      html  css  js  c++  java
  • 洛谷 P2083 找人

    题目背景

    题目描述

    小明要到他的同学家玩,可他只知道他住在某一单元,却不知住在哪个房间。那个单元有N层(1,2……N),每层有M(1,2……M)个房间。

    小明会从第一层的某个房间开始找,他找的方式也很特别,每次到了一个房间,如果不是他的同学,他就会询问这人,

    然后他就会去那人告诉他的房间号,如果还不是,他就会继续按这个方法找下去,直到找到。当然,他也有可能找不到同学。他的体力也是有限的,他每爬一层楼梯就会消耗V体力值。你的任务就是求找到同学耗费的最少体力值,如果找不到,就输出impossible 。

    输入输出格式

    输入格式:

     

    共N+1行。

    第一行,N,M,V,X,Y(X,Y表示同学只在X层Y房间)

    2~N+1行,每行M*2个数字,第i+1行j*2-1个数Ak和j*2个数Ak+1表示住在i层j房间的人提供的信息是Ak层和Ak+1房间。(同学的信息就是自己的房间号)

     

    输出格式:

     

    一个数,即答案。

     

    输入输出样例

    输入样例#1: 复制
    3 3 2 2 3
    1 3 3 3 2 1
    2 3 1 1 2 3
    1 1 1 2 2 3
    
    输出样例#1: 复制
    2

    说明

    N<=1000,M<=100,V<=50
    思路:搜索。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m,v,x,y;
    int ans=0x7f7f7f7f;
    int vis[1010][101];
    int map[1010][101][2];
    void dfs(int i,int j,int sum){
        if(i==x&&j==y){
            ans=min(ans,sum);
            return ;
        }    
        if(!vis[map[i][j][0]][map[i][j][1]]){
            vis[map[i][j][0]][map[i][j][1]]=1;
            dfs(map[i][j][0],map[i][j][1],sum+abs(map[i][j][0]-i));
        }
    }
    int main(){
        scanf("%d%d%d%d%d",&n,&m,&v,&x,&y);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d%d",&map[i][j][0],&map[i][j][1]);
        for(int i=1;i<=m;i++){
            vis[1][i]=1;dfs(1,i,0);
            memset(vis,0,sizeof(vis));
        }
        if(ans==0x7f7f7f7f)    cout<<"impossible"; 
        else cout<<ans*v;
    }

     

    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    java 编程语言基础 第一章 自我介绍
    Spring详解(四)------注解配置IOC、DI
    Spring详解(三)------DI依赖注入
    Spring详解(一)------概述
    mybatis 详解(十一)------ mybatis和spring整合
    mybatis 详解(十)------ 逆向工程
    mybatis 详解(九)------ 一级缓存、二级缓存
    mybatis 详解(八)------ 懒加载
    mybatis 详解(七)------一对一、一对多、多对多
    06-单例模式
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8044616.html
Copyright © 2011-2022 走看看