首页 > 代码库 > hoj1172解题报告

hoj1172解题报告

  题目大致意思是有一个未知4位数n,题目给出几组3个4位数A B C,A表示一个4位数,B表示A中有几个数字猜对,C表示A中有几个数字正确出现.给出这些条件是否能推出n,若能则输出n,否则输出Not sure.

  开始的时候还想根据条件构造出n,但想想了还是放弃了,太过于复杂,突然发现必定是4位数,每次给的条件也不会超过100次,直接穷举n,1000~9999,时间还是够用的。这里要注意的是判断不能推出n的条件,有可能是根据条件找不出n,或者是找出满足条件的n有多个.里面还有些细节要注意在代码中会说明.

  代码如下:

  

#include <set>
#include <map>
#include <queue>
#include <stack>
#include <math.h>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
#include <functional>
using namespace std;
int A[105],B[105],C[105];
int judge(int n,int i,int A[],int B[],int C[]){
int a[4];
a[0] = n/1000;
a[1] = n%1000/100;
a[2] = n%1000%100/10;
a[3] = n%1000%100%10;
int aa[4];
aa[0] = A[i]/1000;
aa[1] = (A[i]%1000)/100;
aa[2] = A[i]%1000%100/10;
aa[3] = A[i]%1000%100%10;
int vis[4];//表示A[i]的第kk位的数字猜对
memset(vis,0,sizeof(vis));
int ans = 0;//有几个数字猜对
int sum = 0;//正确位置出现的次数
for(int k = 0;k < 4;k++){
if(a[k] == aa[k])
sum++;
for(int kk = 0;kk < 4;kk++)
if(a[k] == aa[kk] && !vis[kk]){
ans++;
vis[kk] = 1;
break;//找到一个立即退出
}
}

if(ans == B[i] && sum == C[i]) return 1;
return 0;
}
int main(){
int n;
while(scanf("%d",&n) && n){
for(int i = 0;i < n;i++)
scanf("%d%d%d",&A[i],&B[i],&C[i]);
int ans = 0,sum = 0,t;
for(int i = 1000;i < 10000;i++){
for(int j = 0;j < n;j++){
ans = 0;
if(!judge(i,j,A,B,C))
break;
ans = 1;
}
//满足条件的n
if(ans) {
t = i;
sum++;
}
if(sum > 1) break;//出现1次以上必定不能确定n
}
if(sum > 1|| sum == 0) printf("Not sure\n");
else printf("%d\n",t);
}
return 0;
}

hoj1172解题报告