Safebreaker --解题报告

 又是吉林大学一道ACM题目,题目很简单,直接暴力解决。

 

出处:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1718

 

问题描述:

对一个给定数0000~9999

根据一系列猜测,判断这个数是否存在,存在的话,是否唯一 。

例如:

3321,(给定数)

作出猜测,1223   则有结果,1/0    其中a/b,a表示数的位置正确的个数。这里是第3个数'2',b表示数正确,但是位置不正确的数,这里没有。

就是给出一系列的猜测,

abcd   d/e

.....

 

 

然后根据这一系列数,来推测给定数。。

 

 

算法:

我的算法很简单,暴力,对0000~9999的每个数,根据猜测,判断是不是。从而给出答案。

 

 

AC代码:

#include<iostream> #include<string> using namespace std; string str[20][2]; int n; int key[4]; bool check(int a[]) { int visit[4]; int i,j; int p,q,t,s; for(i=0;i<n;i++) { p=str[i][1][0]-'0';//正确的位置, q=str[i][1][2]-'0';//正确但是位置不对的 t=0; for(j=0;j<4;j++) { visit[j]=0; if(a[j]==str[i][0][j]-'0') {t++;visit[j]=1;} } if(t!=p) return false; s=0; for(j=0;j<4;j++) { if(visit[j]==0) { for(t=0;t<4;t++) { if(visit[t]==0&&str[i][0][t]-'0'==a[j]) {s++;break;} } } } if(s!=q) return false; } return true; } char Key[4]; int solve() { int t; int i; t=0; for(key[0]=0;key[0]<=9;key[0]++) { for(key[1]=0;key[1]<=9;key[1]++) { for(key[2]=0;key[2]<=9;key[2]++) { for(key[3]=0;key[3]<=9;key[3]++) { if(check(key)) { t++; for(i=0;i<4;i++) Key[i]=key[i]+'0'; Key[i]=0; } if(t>=2) return 2; } } } } if(t==0) return 0; return 1; } int main() { int k; int i; cin>>k; while(k--) { cin>>n; for(i=0;i<n;i++) { cin>>str[i][0]>>str[i][1]; } i=solve(); if(i==0) cout<<"impossible"<<endl; else if(i==1) cout<<Key<<endl; else cout<<"indeterminate"<<endl; } return 0; }

 

 

你可能感兴趣的:(Safebreaker --解题报告)