UVa 340 Master-Mind Hints

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   strong   

蛋疼的題目描述,看了好長好長時間才看懂,題目本身是很簡單的。

Designer給出一串長度為N的Code,Breaker用Guess來破譯。

對於兩串數字,如果有同一列相等的數字,那麼叫做strong  match,

位於不同列的相等的兩個數字,叫做weak  match。

題目要求就是先輸出strong的個數,然後是weak的個數。

對了,需要注意的是

1、每個code只能匹配一次,不論是strong還是match。

2、輸出(*,*)的時候注意前面那四個空格,就因為這個我還PE了一次。

如果還不明白,請看這裡

 

再說說我的演算法:我又開了兩個數組num1,num2來分別放code和guess中1~9每個數字出現的次數。首先匹配strong,匹配好的同時將num1和num2中對應的元素減1,表示已經匹配過了。strong匹配完以後,剩下的就是weak。因為已經不存在strong的情況,所以weak直接+=min(code, guess)。

 

以下是原題:



 Master-Mind Hints 

 

MasterMind is a game for two players. One of them, Designer, selects a secret code. The other, Breaker, tries to break it. A code is no more than a row of colored dots. At the beginning of a game, the players agree upon the length N that a code must have and upon the colors that may occur in a code.

In order to break the code, Breaker makes a number of guesses, each guess itself being a code. After each guess Designer gives a hint, stating to what extent the guess matches his secret code.

 

In this problem you will be given a secret code  and a guess  , and are to determine the hint. A hint consists of a pair of numbers determined as follows.

match is a pair (i,j),  and  , such that  . Match (i,j) is called strong when i =j, and is called weak otherwise. Two matches (i,j) and (p,q) are called independent when i = p if and only if j = q. A set of matches is called independent when all of its members are pairwise independent.

 

Designer chooses an independent set M of matches for which the total number of matches and the number of strong matches are both maximal. The hint then consists of the number of strong followed by the number of weak matches in M. Note that these numbers are uniquely determined by the secret code and the guess. If the hint turns out to be (n,0), then the guess is identical to the secret code.

 

Input

The input will consist of data for a number of games. The input for each game begins with an integer specifying N (the length of the code). Following these will be the secret code, represented as N integers, which we will limit to the range 1 to 9. There will then follow an arbitrary number of guesses, each also represented as N integers, each in the range 1 to 9. Following the last guess in each game will be N zeroes; these zeroes are not to be considered as a guess.

 

Following the data for the first game will appear data for the second game (if any) beginning with a new value for N. The last game in the input will be followed by a single zero (when a value for N would normally be specified). The maximum value for N will be 1000.

 

Output

The output for each game should list the hints that would be generated for each guess, in order, one hint per line. Each hint should be represented as a pair of integers enclosed in parentheses and separated by a comma. The entire list of hints for each game should be prefixed by a heading indicating the game number; games are numbered sequentially starting with 1. Look at the samples below for the exact format.

 

Sample Input

 

41 3 5 51 1 2 34 3 3 56 5 5 16 1 3 51 3 5 50 0 0 0101 2 2 2 4 5 6 6 6 91 2 3 4 5 6 7 8 9 11 1 2 2 3 3 4 4 5 51 2 1 3 1 5 1 6 1 91 2 2 5 5 5 6 6 6 70 0 0 0 0 0 0 0 0 00

 

Sample Output

 

Game 1:    (1,1)    (2,0)    (1,2)    (1,2)    (4,0)Game 2:    (2,4)    (3,2)    (5,0)    (7,0)

AC代碼:

 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7  8 const int maxn = 1000 + 5; 9 int code[maxn], guess[maxn];10 int num1[10], num2[10], num3[10];//存放code和guess中每個數字出現的次數11                                  //num3來放num1的拷貝12 13 int main(void)14 {15     #ifdef LOCAL16         freopen("340in.txt", "r", stdin);17     #endif18 19     int N, kase = 0;20     while(scanf("%d", &N) == 1 && N)21     {22         memset(code, 0, sizeof(code));23         memset(num1, 0, sizeof(num1));24         int i;25         for(i = 0; i < N; ++i)26         {27             scanf("%d", &code[i]);28             ++num1[ code[i] ];29         }30         printf("Game %d:\n", ++kase);31         while(true)32         {33             memset(guess, 0, sizeof(guess));34             memset(num2, 0, sizeof(num2));35             memcpy(num3, num1, sizeof(num1));36             for(i = 0; i < N; ++i)37             {38                 scanf("%d", &guess[i]);39                 ++num2[ guess[i] ];40             }41             if(guess[0] == 0)42                 break;43             //統計strong的個數44             int strong = 0;45             for(i = 0; i < N; ++i)46             {47                 if(code[i] == guess[i])48                 {49                     ++strong;50                     --num3[ code[i] ];//每個code[i]只能匹配一次51                     --num2[ guess[i] ];52                 }53             }54             //計算weak55             int weak = 0;56             for(i = 1; i <= 9; ++i)57                 weak += min(num3[i], num2[i]);58             printf("    (%d,%d)\n", strong, weak);59         }60     }61     return 0;62 }
代碼君

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.