UVa 340 Master-Mind Hints (优化查找&复制数组)(二)

2014-11-23 23:21:18 · 作者: · 浏览: 14
,7)和(5,8)这样不是无关的匹配,不能同时存在于一个匹配集中。
2. 上面第三句话说明计算暗示时,优先计算强匹配的数目。
思路:由于只有9个数字,所以只需要统计每个数字出现的个数即可。
强匹配的数目:相同列相同数字的统计一遍,然后相同列相同数字对应的个数减一。
弱匹配的数目:统计1~9在两序列中出现的个数,每个数字加其再两个序列中出现个数的较小值,详见代码。
完整代码:


/*0.019s*/  
  
#include   
#include   
#include   
using namespace std;  
  
int s[1005], g[1005];  
int a[15], b[15], c[15];  
  
int main(void)  
{  
    int cas = 0, n;  
    while (scanf("%d", &n), n)  
    {  
        memset(c, 0, sizeof(c));  
        for (int i = 0; i < n; i++)  
        {  
            scanf("%d", &s[i]);  
            c[s[i]]++;  
        }  
        printf("Game %d:\n", ++cas);  
        while (true)  
        {  
            memcpy(a, c, sizeof(c));// 技巧:用memcpy将c[]中统计的1-9的数的个数赋给a[]  
            memset(b, 0, sizeof(b));  
            for (int i = 0; i < n; i++)  
            {  
                scanf("%d", &g[i]);  
                b[g[i]]++;  
            }  
            if (!g[0]) break;  
            int x = 0, y = 0;  
            for (int i = 0; i < n; i++)  
                if (s[i] == g[i])  
                {  
                    a[s[i]]--;  
                    b[s[i]]--;  
                    x++;  
                }  
            for (int i = 1; i <= 9; i++)  
                y += min(a[i], b[i]);  
            printf("    (%d,%d)\n", x, y);  
        }  
    }  
    return 0;  
}