1. 程式人生 > >微軟程式設計之美的資格賽,這麼簡單的題目害我編了一個多小時——傳話遊戲

微軟程式設計之美的資格賽,這麼簡單的題目害我編了一個多小時——傳話遊戲

微軟程式設計之美的資格賽,這麼簡單的題目害我編了一個多小時,看來還得多聯絡啊!20分到手!放程式碼: 

傳話遊戲

時間限制: 1000ms 記憶體限制: 256MB

描述

Alice和Bob還有其他幾位好朋友在一起玩傳話遊戲。這個遊戲是這樣進行的:首先,所有遊戲者按順序站成一排,Alice站第一位,Bob站最後一位。然後,Alice想一句話悄悄告訴第二位遊戲者,第二位遊戲者又悄悄地告訴第三位,第三位又告訴第四位……以此類推,直到倒數第二位告訴Bob。兩位遊戲者在傳話中,不能讓其他人聽到,也不能使用肢體動作來解釋。最後,Bob把他所聽到的話告訴大家,Alice也把她原本所想的話告訴大家。 

由於傳話過程中可能出現一些偏差,遊戲者越多,Bob最後聽到的話就與Alice所想的越不同。Bob聽到的話往往會變成一些很搞笑的東西,所以大家玩得樂此不疲。經過幾輪遊戲後,Alice注意到在兩人傳話中,有些詞彙往往會錯誤地變成其他特定的詞彙。Alice已經收集到了這樣的一個詞彙轉化的列表,她想知道她的話傳到Bob時會變成什麼樣子,請你寫個程式來幫助她。

輸入

輸入包括多組資料。第一行是整數 T,表示有多少組測試資料。每組資料第一行包括兩個整數 N 和 M,分別表示遊戲者的數量和單詞轉化列表長度。隨後有 M 行,每行包含兩個用空格隔開的單詞 a 和 b,表示單詞 a 在傳話中一定會變成 b。輸入資料保證沒有重複的 a。最後一行包含若干個用單個空格隔開的單詞,表示Alice所想的句子,句子總長不超過100個字元。所有單詞都只包含小寫字母,並且長度不超過20,同一個單詞的不同時態被認為是不同的單詞。你可以假定不在列表中的單詞永遠不會變化。

輸出

對於每組測試資料,單獨輸出一行“Case #c: s”。其中,c 為測試資料編號,s 為Bob所聽到的句子。s 的格式與輸入資料中Alice所想的句子格式相同。

資料範圍

1 ≤ T ≤ 100

小資料:2 ≤ N ≤ 10, 0 ≤ M ≤ 10 

大資料:2 ≤ N ≤ 100, 0 ≤ M ≤ 100 

樣例輸入
2
4 3
ship sheep
sinking thinking
thinking sinking
the ship is sinking
10 5
tidy tiny
tiger liar
tired tire
tire bear
liar bear
a tidy tiger is tired
樣例輸出
Case #1: the sheep is thinking
Case #2: a tiny bear is bear

#include <stdio.h>

#include <string.h>
#include <stdlib.h>
#include <time.h>
char aa[110][110];
char bb[110][110];
char senten[110][110];
char input[110];
int count;
void divide()
{
    count=0;
    char temp[110];
    memset(temp,'\0',sizeof(temp));
    int tempc=0;
    for(int i=0;i<strlen(input);i++)
    {
        if(input[i]==' ')
        {
            //printf("temp:%s\n",temp);
            for(int j=0;j<strlen(temp);j++)
            senten[count][j]=temp[j];


            //printf("senten:%s\n",senten[count]);
            count++;
            tempc=0;
            memset(temp,'\0',sizeof(temp));
            continue;
        }
        temp[tempc++]=input[i];
    }
    //printf("count:%d\n",count);
}
void exchange(int m)
{
    for(int i=0;i<count;i++)
    {
        for(int j=0;j<m;j++)
        if(strcmp(senten[i],aa[j])==0)
        {
            //printf("sen:%s,bb:%s\n",senten[i],bb[j]);
            strcpy(senten[i],bb[j]);
            break;
        }
    }
}
void print()
{
        for(int ll=0;ll<count;ll++)
        {
            if(ll==0) printf("%s",senten[ll]);
            else printf(" %s",senten[ll]);
        }
        printf("\n");
}
void print2()
{
        for(int ll=0;ll<count;ll++)
        {
            printf("%s\n",senten[ll]);
        }
        printf("\n");
}
int main()
{
    freopen("data.in","r",stdin);
    int num;
    scanf("%d",&num);
    for(int l=0;l<num;l++)
    {
        memset(aa,'\0',sizeof(aa));
        memset(bb,'\0',sizeof(bb));
        memset(senten,'\0',sizeof(senten));
        memset(input,'\0',sizeof(input));
        int n,m;///分別表示遊戲者的數量和單詞轉化列表長度。隨後有 M 行
        scanf("%d%d",&n,&m);
        for(int ll=0;ll<m;ll++)
        {
            scanf("%s%s",aa[ll],bb[ll]);
        }
        getchar();
        //for(int ll=0;ll<m;ll++)
        //printf("a:%s   b:%s\n",aa[ll],bb[ll]);


        gets(input);
        input[strlen(input)]=' ';
        //printf("%s\n",input);
        divide();
        //printf("after divide:");
        //print();
        for(int ll=0;ll<n-1;ll++)
        {
            exchange(m);
            //printf("ll:%d\n",ll);
            //print2();
        }
        printf("Case #%d: ",l+1);
        print();
    }
    //printf("time used:%f\n",(double)clock()/CLOCKS_PER_SEC);
    return 0;
}