首页 > ACM题库 > HDU-杭电 > hdu 2000 ASCII码排序[解题报告]C++
2013
12-26

hdu 2000 ASCII码排序[解题报告]C++

ASCII码排序

问题描述 :

输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。

输入:

输入数据有多组,每组占一行,有三个字符组成,之间无空格。

输出:

输入数据有多组,每组占一行,有三个字符组成,之间无空格。

样例输入:

qwe
asd
zxc

样例输出:

e q w
a d s
c x z

ASCII码排序

时间限制:3000 ms  |  内存限制:65535 KB
难度:2
描述
输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。

输入
第一行输入一个数N,表示有N组测试数据。后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格。
输出
对于每组输入数据,输出一行,字符中间用一个空格分开。
样例输入
3
qwe
asd
zxc
样例输出
e q w
a d s
c x z

题目链接http://acm.nyist.net/JudgeOnline/problem.php?pid=4

#include <stdio.h>
#include <string.h>

void swap(char *a, char *b)
{
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

    int
main( int argc, char **argv )
{
    int n;
    char buf[4];

    scanf("%d", &n);

    for ( int i = 0; i < n; ++i )
    {
        scanf("%s", buf);
        // 首先得到最小的放到buf[0] 
        if ( buf[0] > buf[1] )
            swap(buf, buf+1);
        if ( buf[0] > buf[2] )
            swap(buf, buf+2);
        // 再排老二与老三
        if ( buf[1] > buf[2] )
            swap(buf+1, buf+2);

        for ( int i = 0; i < 3; ++i )
            printf( "%c ", buf[i] );

        printf( "\n" );
    }

    return 0;
}

作者:帅得不敢出门    c++哈哈堂31843264

解题转自:http://blog.csdn.net/zmlovelx/article/details/8758923


  1. 在方法1里面:

    //遍历所有的边,计算入度
    for(int i=0; i<V; i++)
    {
    degree = 0;
    for (j = adj .begin(); j != adj .end(); ++j)
    {
    degree[*j]++;
    }
    }

    为什么每遍历一条链表,要首先将每个链表头的顶点的入度置为0呢?
    比如顶点5,若在顶点1、2、3、4的链表中出现过顶点5,那么要增加顶点5的入度,但是在遍历顶点5的链表时,又将顶点5的入度置为0了,那之前的从顶点1234到顶点5的边不是都没了吗?

  2. 我还有个问题想请教一下,就是感觉对于新手来说,递归理解起来有些困难,不知有没有什么好的方法或者什么好的建议?