您的位置:首页 > 其它

ZOJ 1151 Word Reversal

2014-05-04 16:11 357 查看
题目大意:

现有多个测例(测例数题中给出),每个测例中都会输入一篇文章,会给出文章的行数N(int型),然后给出文章中每行的内容,现要求把每行中的单词反转,其余不动,然后输出,输出时测例之间有空行,最后一个测例后没有空行。

题目链接

注释代码:

/*
* Problem ID : ZOJ 1151 Word Reversal
* Author     : Lirx.t.Una
* Language   : C
* Run Time   : 0 ms
* Run Memory : 168 KB
*/

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

//表示当前指针是在一个单词内还是在一个单词外
#define	IN		1
#define	OUT		0

//经测试的每行最大长度
#define	MAXLEN		50

char	s[MAXLEN];//string,用于存储一行

void
srev( char *st, char *en ) {//string reverse,单词反转
//分别为start和end指针

char	ch;//临时变量

while ( st < en ) {//交换

ch    = *st;
*st++ = *en;
*en-- = ch;
}
}

int
main() {

int		t;//测例数
int		n;//行数
int		l;//一行的长度(即字符个数,包括空格等)

int		st, en;//start和end指针

int		flag;//标志,表示当前指针处于单词内还是单词外

int		i;//扫描指针

scanf("%d", &t);
while ( t-- ) {

scanf("%d\n", &n);
while ( n-- ) {

flag = OUT;//每行扫描开始都将指针设为在单词外
gets(s);//获取一行
l = strlen(s);

for ( i = 0; i <= l; i++ ) {

//之前指针在单词外,并且当前指针不指向空格或者字符串结尾标志
if ( OUT == flag && s[i] != ' ' && s[i] ) {//则表示刚刚进入一个单词

st   = i;//设定start
flag = IN;//改变标记

continue;
}

//表示指针仍然在当前单词内
if ( IN == flag && s[i] != ' ' && s[i] )
continue;

//之前还在单词内的,但是当前指针指向空格或者字符串结尾标志
if ( IN == flag && ( ' ' == s[i] || !s[i] ) ) {
//这就表示刚刚退出一个单词

en   = i - 1;//记录结尾
flag = OUT;//该表标记
srev( s + st, s + en );//并对筛选的单词进行翻转

continue;
}
}

puts(s);//打印一行
}

if (t) putchar('\n');//输出测例之间空一行,最后一个测例后没有空行
}

return 0;
}


无注释代码:

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

#define	IN		1
#define	OUT		0

#define	MAXLEN		50

char	s[MAXLEN];

void
srev( char *st, char *en ) {

char	ch;

while ( st < en ) {

ch    = *st;
*st++ = *en;
*en-- = ch;
}
}

int
main() {

int		t;
int		n;
int		l;

int		st, en;

int		flag;

int		i;

scanf("%d", &t);
while ( t-- ) {

scanf("%d\n", &n);
while ( n-- ) {

flag = OUT;
gets(s);
l = strlen(s);

for ( i = 0; i <= l; i++ ) {

if ( OUT == flag && s[i] != ' ' && s[i] ) {

st   = i;
flag = IN;

continue;
}

if ( IN == flag && s[i] != ' ' && s[i] )
continue;

if ( IN == flag && ( ' ' == s[i] || !s[i] ) ) {

en   = i - 1;
flag = OUT;
srev( s + st, s + en );

continue;
}
}

puts(s);
}

if (t) putchar('\n');
}

return 0;
}


单词解释:

reversal:n, 逆转,反转
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: