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

题目: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
#include
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;jf[i][k]+f[k][j])
                    f[i][j]=f[i][k]+f[k][j];
    if(f[1][n]==1e9)cout<<"NO\n";
    else cout<

 

你可能感兴趣的:(最优乘车——getchar()的困惑之解,最短路)