最优乘车——getchar()的困惑之解,最短路

本文详细解析了在线裁判(OJ)中一道关于最短路径的问题,通过具体实例讲解了如何利用邻接矩阵和Floyd算法求解,并分享了在不同编译环境下调试代码的经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:http://111.231.101.32/problem.php?id=1005(自建OJ,欢迎光临)

分析:

比如线路3 6 7 5,则3可以到达6,7,5,从而赋值f[3][6,7,5]=1,6可以到达7,5,从而赋值f[6][7,5]=1。下面就是最短路问题。

易困惑点:

写好代码后,在DEVC++上过了所有测试点,但提交OJ后却卡掉很多点,原因在于DEVC++把回车符与换行符当作换行符处理,而OJ是分得很清楚的。

比如

3 6 7 5

4 5

用getchar()去读入第一行,得到的是字符3,空格,字符6,空格,字符7,回车符(ASCII码为13),换行符(ASCII码为10)。

为了在DEVC++与OJ上通用,采用以下代码:

c=getchar();
if(c==13) c=getchar();

对于DEVC++,直接认为第一行代码吸收的是换行符,从而不执行第二行代码的主体。 
对于洛谷,或者hustoj,因为先吸收回车符,从而执行第二行代码的主体而吸收掉换行符。

另外需要注意的是,文件结束是EOF。 

AC代码:

#include<cstdio>
#include<iostream>
using namespace std;
int m,n,a[501],f[501][501];
char c; 
int main(){
    cin>>m>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i!=j)f[i][j]=1e9;
    c=getchar();        
    while(c==13){/*回车键13*/
        c=getchar();
    }
    for(int i=1;i<=m;i++){
        int t=0,s=0;
        char c;
        while(1){
            c=getchar();
            while(c==' '){
            c=getchar();    
            }
            t++;
            s=0;
            while(c<='9' && c>='0'){
                s=s*10+c-'0';
                c=getchar();
            }
            a[t]=s;
            while(c==13)/*回车键13*/
                c=getchar();
            /*换行键10,或者到了文件结束标志EOF*/ 
            if(c==10||c==EOF)break;
        }
        for(int j=1;j<t;j++)
            for(int k=j+1;k<=t;k++)
                f[ a[j] ][ a[k] ]=1;                
    }
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(i!=j && i!=k && j!=k
                && f[i][j]>f[i][k]+f[k][j])
                    f[i][j]=f[i][k]+f[k][j];
    if(f[1][n]==1e9)cout<<"NO\n";
    else cout<<f[1][n]-1<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值