辣鸡小二本的ACM奋斗路1 strcmp函数

来源:互联网 发布:智能马桶圈 知乎 编辑:程序博客网 时间:2024/06/08 16:25

今天被老师告知,我要作为大一队的队员4月底去杭州比赛。

内心是有点小激动的,上次校内比赛才ac一题(大一都只有1题),对我的打击也是蛮大的,也算是明白自己的不足有很多吧。慢慢来,最近在同学的帮助下又新学会了几个新函数。

1. strcmp 函数

表达式为strcmp(字符a,字符b)

若字符a>b  则返回整数

若字符a<b 则返回负数

若字符a=b 则返回0

这个函数包含在string.h这个头文件下,所以要先声明#include<string.h> 才能使用

那么这个函数有什么用呢?其实我也是上周六参加校内的程序设计比赛后,才发现这个函数的用途之一(比赛时没做出来T T) 下面是题目

—————————————————————————————————————————————————————————————————————————————

 下雨

介绍
下雨了,不过小King可没心情欣赏雨景,因为,他没带伞!
小King所在地可以简化成类似如下的平面图:

...*.**.
****....
*..*.**.
...*...*
其中”.”代表平地,如果小King在这个地方就会被雨淋到,“*”表示可以避雨的地方,如果小King在这里就不会被雨淋到.
小King一次行动需要一秒,up表示向上一格,down表示向下一格,left表示向左一格,right表示向右一格.
现在给定小King的行动轨迹和小King所在地的平面图,求他一共会被雨淋到多少秒.
小King最初位置总是在左下角,并且小King不会走出给定的平面图.

输入格式描述
第一行有一个整数T(T<=20),表示有T个测试样例.
每个测试样例的第一行有两个整数N,M(1<=N,M<=500)分别表示平面图的宽和高,接下来是一个平面图.接下来一个整数K(0<=K<=10000)表示小King行动了K步,接下来K行,每行一个单词,表示小King行动的方向.


输出格式描述
对于每组测试样例,输出一个整数,表示小King被雨淋到的秒数.


样例输入 样例输出
1
8 4
4
...*.**.
****....
...*.**.
...*...*
5
up
up
right
down
left


提示
开始和结束的地方也要算一秒.
如果把左下角作为(0,0)向上为X坐标正方向,向右为Y坐标正方向,则他依次经过了(0,0),(1,0),(2,0),(2,1),(1,1),(1,0),其中(0,0)和(1,1)和(1,0)会被雨淋到.


—————————————————————————————————————————————————————————————————————————————


当时我卡在这到题上卡了好久都没做出来(虽然到比赛结束为止我也没做出来)比赛之后问了同学,他给了代码,我发现其中有一个strcmp函数,这是我第一次见到这个函数,于是我百度了下,大概知道了它的用法。

在这题里我发现这个函数很适合用来比较一个输入的数是否是一个已知的字符串。

比如最后的输入方向时,代码可以用

——————————————————————————————————————————————

scanf("%s",dis);
if(strcmp(dis,"up")==0)
g--;
else if(strcmp(dis,"down")==0)
g++;
else if(strcmp(dis,"right")==0)
k++;
else if(strcmp(dis,"left")==0)
k--;
if(a[g][k]=='.')
num++;

——————————————————————————————————————————————

可以用strcmp来让程序实现移动并判断是否会被淋到。是不是比if要简洁很多呢?

—————————————————————————————————————————————————————————————————————————————

既然说到这题,那么再说点比赛的时候的事吧。

比赛的时候,当我写到这题的时候,看到

...*.**.
****....
*..*.**.
...*...*

我第一时间想到的是用二维数组,于是我尝试了用二维数组来输入。当时我选择的是用两层循环来输入二维数组,十分麻烦。后来用了同学的方法简洁多了。

——————————————————————

char x,y;
char a[550][550];
char dis[10];
int num,zu,bu,k,g,k2,g2;
scanf("%d",&zu);
while(zu--){
scanf("%d%d",&k,&g);
for(g2=0;g2<g;g2++){
scanf("%s",a[g2]);
}

——————————————————————

只用了一层循环就好了,而且也减少了出错。

这题其实并不算难。我当时卡住的原因主要有两点

第一点:我用%c来读取字符串,所以造成了\n也会被读取,造成每次还没输完程序就结束的情况。

第二点:我后面用了太多if来判断,并且没用字符数组来储存输入的方向字符,导致报错。


几点心得,%c要慎用。。 字符数组可以直接scanf("%s",a);来输入(a是数组)


所以这题做不出来是我的水平不行,后来参考了同学的代码,我自己最后做出了这题。下面附上源码:

———————————————————————————————————————————————————————————

#include<stdio.h>
#include<string.h>
int main()
{
char x,y;
char a[550][550];
char dis[10];
int num,zu,bu,k,g,k2,g2;
scanf("%d",&zu);
while(zu--){
scanf("%d%d",&k,&g);
for(g2=0;g2<g;g2++){
scanf("%s",a[g2]);
}
scanf("%d",&bu);
num=0;
k=0;
g--;
if(a[g][k]=='.')
num++;
while(bu--){
scanf("%s",dis);
if(strcmp(dis,"up")==0)
g--;
else if(strcmp(dis,"down")==0)
g++;
else if(strcmp(dis,"right")==0)
k++;
else if(strcmp(dis,"left")==0)
k--;
if(a[g][k]=='.')
num++;
}
printf("%d\n",num);
}
return 0;
}

————————————————————————————————————————————————————————————


ACM之路漫长啊,还有一个月就要去比赛了,虽然说主力是大二大三,大一的只是过去打个酱油,但是也要尽力吧。嗯。


1 0
原创粉丝点击