uva489劊子手遊戲

背景:此題主要注意一個地方,那就是猜對的字母再猜也算錯。

思路:我是先把需要猜的那個字符串排序,然後依次判斷,將其複製到另外一個字符串數組中,並在複製中剔除重複的元素,這樣就可以不用考慮需要猜的字符串中哪些字符是重複的,請注意k==m1+1這個地方,爲什麼要加一,請讀者去調試一下就知道了。然後對於猜對的字母再猜也算錯這個問題,解決方法就是每判斷一次,如果猜對了,就將那個賦值爲空格。

學習:strchr(str,ch)函數返回的是字符ch在字符串str出現的首地址,所以在這個地方可以不用for循環再來找一遍,但筆者再寫的時候對指針使用還不太熟悉,所以就用的for循環再找了一遍,讀者可以自行去修改。

if(strchr(str,guess[i])!=NULL)
            {
                k++;
                for(int gue=0;gue<=m1;gue++)
                    if(guess[i]==str[gue]) {str[gue]=' ';break;}
            }
下面是完整代碼。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main(void)
{
    char ans[100],guess[100];
    int yx;
    while(scanf("%d",&yx)==1&&yx!=-1)
    {
        memset(ans,'a',sizeof(ans));
        memset(guess,'a',sizeof(guess));
        scanf("%s %s",ans,guess);
        int m=strlen(ans);
        printf("Round %d\n",yx);
        sort(ans,ans+m);
        char str[27]={'\0'};
        int m1=0;
        for(int i=0;i<m-1;i++)
            if(ans[i]!=ans[i+1]) {str[m1]=ans[i];m1++;}
        str[m1]=ans[m-1];
        int j=0,k=0;
        for(int i=0;i<strlen(guess);i++)
        {
            if(strchr(str,guess[i])==NULL) j++;
            if(strchr(str,guess[i])!=NULL)
            {
                k++;
                for(int gue=0;gue<=m1;gue++)
                    if(guess[i]==str[gue]) {str[gue]=' ';break;}
            }
            if(j==7) {printf("You lose.\n");break;}
            if(k==(m1+1)) {printf("You win.\n");break;}
        }
        if(j<7&&k<=m1) printf("You chickened out.\n");
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章