UVA 340 Master-Mind Hints

来源:互联网 发布:外文五大数据库 编辑:程序博客网 时间:2024/04/30 15:54

(引用题意):输入整数N(每行代码长度);输入有多组数据,当n=0时表示结束;而在每组中,以最后输n0结束。对于每组数据,第一行编码为出题者的(S1,S2,...,Sn),接下来的为猜测者的编码(g1,g2,g3,...gn)。若Si=gj并且i=j,你将得到个A;若Si=gji≠j,你将得到B程序先从1找到n找能得到多少A,然后在找能得到多少B注意:对于每个Sigj只能使用一次。然后输出AB的个数以(X,Y)形式。(XAYB)。


我的代码:

#include<iostream>

using namespace std;

int main()
{
    const int maxn=1002;  //每行最大长度
    int secret[maxn];  //秘密代码
    int guess[maxn];  //猜想
    int temp[maxn];  //秘密代码副本
    int N;  //每行数字个数
    int strong, weak;  //猜对的两种状态
    int count; //用来判断读入整行0
    int game = 0;  //第几次游戏
    
    while(cin>>N && N)
    {
        game++;
        cout<<"Game "<<game<<":"<<endl;
        for(int i = 0; i < N; i++)
            cin>>secret[i];  //秘密代码
        while(1)
        {
            //初始化
            count = 0;
            strong = 0;
            weak = 0;      
            for(int a = 0; a < N; a++)
            {
                cin>>guess[a];  //猜想
                if(guess[a] == 0)
                {
                    count++;
                }
            }
            //判断是否整行全为0
            if(count == N)
                break;
            for(int k = 0; k < N; k++)  //创建秘密代码副本
                temp[k] = secret[k];
            //判断同列
            for(int j = 0; j < N; j++)
            {
                if(guess[j] == temp[j])  //同列
                {
                    //以下两行表示已经使用过
                    temp[j] = 0;
                    guess[j] = -1;  
                    strong++;
                }
            }
            //判断不同列
            for(int m = 0; m < N; m++)
            {
                for(int n = 0; n < N; n++)
                {
                    if(guess[m] == temp[n])
                    {
                        weak++;
                        temp[n] = 0;
                        break;  //关键居然是这个问题。唯一性(只能用一次)
                    }
                }
            }
            cout<<"    "<<"("<<strong<<","<<weak<<")"<<endl;
        }
    }
    return 0;
}
原创粉丝点击