UVa 340 - Master-Mind Hints 解题报告 - C语言
1.题目大意
比较给定序列和用户猜想的序列,统计有多少数字位置正确(x),有多少数字在两个序列中都出现过(y)但位置不对。
2.思路
这题自己思考的思路跟书上给的思路差不多。第一个小问题——位置正确的数字数量可以很容易求出,第二个小问题——在两个序列中都出现过但位置不对的数字数量则要由“y-x=在两个序列中都出现过的数字数量-位置正确的数字数量”得出。
3.应当注意的问题
(1)虽然思路大同小异,但是具体实现的过程中能否很好地实现则很考验人。最开始写这题的时候,我甚至定义了4个数组,这点在后来证明了是没有必要的。因此在实现的过程中,如何简化应该是值得思考和练习的。
(2)对于结束的判断,“正常的猜测序列不会有0,所以只判断第一个数是否为0即可”,其实在判断结束的实现这里我卡了一下,说明对题目的理解还不够。
4.代码
#include"stdio.h" #define maxn 1005 int main() { int n,i,d,x,y,num1,num2,times=0; int a[maxn],b[maxn]; while(scanf("%d",&n)==1 && n) { printf("Game %d:\n",++times); //数据组数编号 for(i = 0; i < n; i++) scanf("%d",&a[i]); for(;;) { x = 0; y = 0; for(i = 0; i < n; i++) { scanf("%d",&b[i]); if(a[i] == b[i]) x++; //统计有多少数字位置正确 } if(b[0] == 0) break; for(d = 1; d < 10; d++) { num1=0; num2=0; for(i = 0; i<n; i++) { if(d == a[i]) num1++; if(d == b[i]) num2++; } if(num1 < num2) y += num1; else y += num2; } printf(" (%d,%d)\n",x,y-x); } } return 0; }
参考书目:算法竞赛入门经典(第2版) 刘汝佳 编著