uva 340 Master-Mind Hints

3698 ワード

まとめ:
题意は読んでいないで、他の人のそれから例を结び付けて理解して、ネット上で题意の多くはすべて同じだと感じて、私は実例を通じて比较的に実际的に浅い言叶でこの问题を说明して、みんなに役に立つことを望みます
 4 1 3 5 5         a
1 1 2 3         b        (1,1) 4 3 3 5         c         (2,0) 6 5 5 1         d         (1,2) 6 1 3 5         e         (1,2) 1 3 5 5         f          (1,2) 0 0 0 0
题意:a行は设计者の出したパスワードで、下のいくつかの行はすべて解読者の出した推測で、下の毎回推測するあの行のパスワードを一回a行のコードと比较して、まずすべてのstrongのを比较して、つまり2行は値が同じだけではなくて、しかも位置はすべて同じで、1つを発见して1をプラスして、得た数は括弧の中の第1の数字で、注意して、各行が推測するパスワードをa行コードと比較する場合、位置ごとの数字は1回しか使用できないので、2つのタグ配列でパスワードの使用状況を記録したほうがいいです.次にweakの値、つまり2行の値が同じでも、位置が異なり、位置ごとにマークされていないので、1つを見つけると1つ追加し、値は括弧の2番目の大きさです.
 
  i
  0
 1
2
3
a
 1
3
5
5
b
 1
1
2
3
c
4
3
5
5
自分の表現がよくないことを考えて、b行とc行で説明します.
b行のstrongとweakの値はそれぞれ括弧の中の2つの数で、strongのその1は(a.0)(b.0)、weakは(a.1)(b.3)です.
c行strong値は2つあり、1つは(a,1)(c,1)、もう1つは(a.3)(c.3)weakの要件を満たしていない
 
私は拭いて、もとは表現するのがとても簡単だと思って、意外にもこんなに疲れて、おや、国語は悪いです
次の时に私のコード、提出する时runtime errorが现れて、杨さんの注意を経て、この间违いは普通はすべて配列の境界を越えて引き起こしたので、后でしっかり覚えます
 
#include <stdio.h>
#include <stdlib.h>
const int MAXN = 100000;

int main( )
{
    int code_len,games = 0;
    int s[MAXN],g[MAXN];       
    while (scanf("%d",&code_len) == 1){
          if ( !code_len ) break;
          printf("Game %d:
",++games); int i,j; for ( i = 0; i < code_len; i++) scanf("%d",&s[i]); int s_mark[MAXN],g_mark[MAXN]; for (;;){ int sum = 0; int strong= 0,weak = 0; for ( i = 0; i < code_len; i++){ scanf("%d",&g[i]); sum += g[i]; } if ( sum == 0) break; // 0 memset(s_mark,0,sizeof(s_mark)); memset(g_mark,0,sizeof(g_mark)); // for ( i = 0; i < code_len; i++){ // strong for( j = 0; j < code_len; j++){ if ( !s_mark[j] && !g_mark[i] ){ if (g[i] == s[j] && i == j) { s_mark[j] = 1; g_mark[i] = 1; strong++; break;} //if (g[i] == s[j] && i != j) // { s_mark[j] = 1; g_mark[i] = 1; weak++; break;} // , BUG } } } for ( i = 0; i < code_len; i++){ // weak for( j = 0; j < code_len; j++){ if ( !s_mark[j] && !g_mark[i] ){ if (g[i] == s[j] && i != j) { s_mark[j] = 1; g_mark[i] = 1; weak++; break;} } } } printf(" (%d,%d)
",strong,weak); } } return 0; }

同様に1つのきれいなコードのリンクを与えて、とても簡素で、いくつかの小さい技巧があって、テーマの条件の利用に対して、例えばパスワードはすべて1から9で、比較した後に値をすべて0に設定して、2つの外でマークの配列を設定する必要はありませんが、毎回パスワードをコピーして、総じて言えば、メモリのオーバーヘッドはやはり小さくて、学ぶ価値があります
http://www.cppblog.com/rakerichard/archive/2011/04/09/143775.html