zoukankan      html  css  js  c++  java
  • 问题 B: 寻路

    问题 B: 寻路

    时间限制: 1 Sec  内存限制: 128 MB
    [提交] [状态]

    题目描述

    明明同学被困在一个荒凉的北极岛屿,他可以用小船乘着海流用1单位时间从一个岛移动到另一个岛。他得到了一个海洋地图,有N(1<=N<=100)条单向海流航线,编号为1..N。
    告诉你他的起始位置M(1<=M<=N)和地图,请编程帮助明明确定到达每个岛的最短时间是多少。
    输入为一个矩阵C,第r行,第c列的值若为1,则r到c存在海流,值为0则不存在海流。

    输入

    第1行:两个用空格隔开的整数:N和M
    第2..N+1:第i+1行包含N个用空格隔开的整数:C_R

    输出

    第1..??行:第一行输出M,第i+1行包含时刻i能到达的岛屿(升序排列)

    样例输入 Copy

    4 1 
    0 1 0 1 
    0 0 1 0 
    0 0 0 1 
    0 0 0 0
    

    样例输出 Copy

    1
    2 4
    3
    这个题可以用最短路也可以用模拟:
    模拟大法:
    #include<bits/stdc++.h> 
    #include <math.h>
    using namespace std;
    typedef long long ll; 
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int maxn=110;
    const int inf=0x3fffffff;
    int a[maxn][maxn];
    int k[maxn];
    int p[maxn];
    int n,m;
    void inint(){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cin>>a[i][j];
            }
        }
    }
    int main(){
        inint();
        int ans=1;
        printf("%d
    ",m);
        k[m]=1;
        for(int i=1;i<=n;i++){
            if(a[m][i]==1){
                printf("%d ",i);
                ans++;
                k[i]=1;
            }
        }
        printf("
    ");
        int z=2,o=0;
        int pp=0;
        while(1){
            pp++;
            o=0;
            for(int i=1;i<=n;i++){
                if(i==m){
                    continue;
                }
                if(k[i]==(z-1)){
                    for(int j=1;j<=n;j++){
                        if(k[j]==0&&a[i][j]==1){
                            p[o++]=j;
                            k[j]=z;
                            ans++;
                        }
                    }
                }
            }
            sort(p,p+o);
            for(int i=0;i<o;i++){
                if(k[p[i]]==z)
                    printf("%d ",p[i]);
            }
            z++;
            if(ans==n||pp>=100){
                break;
            }
            printf("
    ");
        }
    } 
     
  • 相关阅读:
    Android View 的绘制流程
    Android Studio 注释模板
    Flutter https://flutter.cn/docs学习之 工作原理
    Android 手机兼容差异
    Flutter plugin的两种方式
    本周总结
    mapreduce程序开发简单实例 WordCount
    《需求工程——软件建模与分析》阅读笔记之一
    本周总结
    本周总结
  • 原文地址:https://www.cnblogs.com/lipu123/p/12764412.html
Copyright © 2011-2022 走看看