成都设计平台,南京网站流量优化,网页设计素材为什么拖不进ps,百度热搜seo题干#xff1a;
猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的#xff1a;计算机随机产生一个四位数#xff0c;然后玩家猜这个四位数是什么。每猜一个数#xff0c;计算机都会告诉玩家猜对几个数字#xff0c;其中有几个数字在正确的位置上。 比如计算机随…题干
猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的计算机随机产生一个四位数然后玩家猜这个四位数是什么。每猜一个数计算机都会告诉玩家猜对几个数字其中有几个数字在正确的位置上。 比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中而且1在这两个数中的位置是相同的所以计算机会告诉玩家猜对了2个数字其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字有2个在正确的位置。 现在给你一段gameboy与计算机的对话过程你的任务是根据这段对话确定这个四位数是什么。
Input
输入数据有多组。每组的第一行为一个正整数N(1N100)表示在这段对话中共有N次问答。在接下来的N行中每行三个整数A,B,C。gameboy猜这个四位数为A然后计算机回答猜对了B个数字其中C个在正确的位置上。当N0时输入数据结束。
Output
每组输入数据对应一行输出。如果根据这段对话能确定这个四位数则输出这个四位数若不能则输出Not sure。
Sample Input
6
4815 2 1
5716 1 0
7842 1 0
4901 0 0
8585 3 3
8555 3 2
2
4815 0 0
2999 3 3
0
Sample Output
3585
Not sure 解题报告 因为这题元素不多1000-9999所以枚举一下就可以了。然后看跑完一遍以后如果有多个满足条件的那就notsure如果只有一个满足条件的那就输出这一个。然后还要注意fit函数中必须用book数组记录当前位置是否判断过在判断猜对数字时需要用在判断猜对位置时不需要用否则 1234 和5116这种在循环的时候也会被判断成有两个猜对数字但其实只有一个猜对数字。
AC代码
#includecstring
#includeset
#includeiostream
#includealgorithm
#includecstdio
#define ll long long
using namespace std;
int n;
int guess[5000],yes[5000],yespos[5000];
setint :: iterator it;
//比较set中值和guess中i 看set中的是否满足这个gusee如果不满足那就删除这个可能值。
bool fit(int inset,int ii) {
// int ge[2],shi[2],bai[2],qian[2];int tmp guess[ii];int geussi[5] ;int inseti[5] ;int p 0;while(inset) {inseti[p] inset%10;inset/10;}p 0;while(tmp) {geussi[p] tmp%10;tmp/10;}int ans 0;bool bk1[5],bk2[5];memset(bk1,0,sizeof(bk1));memset(bk2,0,sizeof(bk2));for(int i 1; i4; i) {for(int j 1; j4; j) {if(geussi[i] inseti[j] !bk1[i] !bk2[j]) {ans;bk1[i]1;bk2[j] 1;}}}if(ans ! yes[ii]) return 0 ;ans 0;for(int i 1; i4; i) {if(geussi[i] inseti[i]) ans;}if(ans ! yespos[ii]) return 0 ;return 1;
// ge[0] inset%10;ge[1] geussi%10;
// inset/10;geussi/10;
// shi[0] inset%10;shi[1] geussi%10;
// inset/10;geussi/10;
// bai[0]inset%10;bai[1] geussi%10;
// inset/10;geussi/10;
// qian[0]inset%10;qian[1] geussi%10;
// }
int main()
{while(scanf(%d,n)) {if(n 0 ) break;setint st;
// for(int i 1000; i9999; i) st.insert(i);for(int i 1; in; i) {scanf(%d%d%d,guess[i],yes[i],yespos[i]);}int ans 0,res,flag;
// while(!st.empty()) {
// for(it st.begin(); it!st.end(); it) {for(int q 1000; q9999; q) {flag 0;for(int i 1; in; i) {if(!fit(q,i)) {flag 1; break;}}if(flag 0) {res q;ans;}if(ans 2) break;} if(ans2) cout Not sureendl;else cout res endl;
// }
// }
// if(st.empty() || st.size() !1) puts(Not sure);
// else printf(%d\n,*(st.begin()));}return 0 ;
}
总结 本来想用set 然后枚举过一个就删除一个顶点但是发现没必要啊反正整个循环你就跑一次即1000~9999这些数字就跑一次用set有卵用。。。。