主题链接
主题:
栗主席(lizi )是某xxxx大学的专业猴子,难道他有女盆友,我们假设是QQ!
当天,QAQ问板栗:“你的小米5s图片解锁密码到底是多少?
栗:算了吗? 仔细想想……
QAQ :你好像在戏弄我…
.
栗:解锁我的图片我用过好几次密码。 之后,因为用指纹解除了锁定,所以忘记了密码的痛苦。 但我记得可能是那几个密码
QAQ :那么,请一定要告诉我…
栗: …
然后,栗写下了一堆可能的密码。 在安卓图案的锁定解除中,会显示与数字对应的位置。
不过,栗子当然不想把真正的密码告诉QAQ,所以在QAQ上提供的一系列密码中,甚至有不符合安卓图案解锁规则的密码。
QAQ也知道栗子不诚实,给了他很多错误的密码,甚至是不符合规则的密码。 所以,我想让你找出哪个密码不符合规则。
Android解锁密码具有以下特点:
1 .每个数字最多只使用一次。
2 .想直接连接两个数字,但只有线段中有另一个数字通过,且该数字以前已经使用过,才合法。 (例如,如果想从1到9连续领取,1-3-9或者3之前已经使用过,可以从1-9直接领取)
输入说明:
多组输入
每组输入占一行,包含一系列数字(1~9),长度不超过30
输出说明:
输出该Android模式,判断解锁是否合法,如果合法则输出“YES”,如果相反则输出“NO”。 (请参阅示例输出。 请勿输出引号。 )
问题解:我个人认为,从数字的角度直接考虑的话,情况太多了,容易出错,所以我们还是直接建立关系比较好
你会发现经过的点都在连接线的中点
针对这些情况
中点可以计算,但点的坐标不是全部整数。 这一点不在考虑之内。 那么,把情况分成两类,一次列举所有的数就可以了
代码如下。
# include iostream # include string # include string.h # includecmathusingnamespacestd; int biao[4][4]; int main () { string a; while(Cina ) ) memset ) Biao,0,Sizeof ) Biao ); for(intI=0; i=a.length ()-1; I ) if ) I==a.Length(-1 ) {cout'YES'endl; 布雷克; } int x=a[i]-'0'; int y=a[i 1]-'0'; int a、b、c、d; if(x%3==0) {a=x/3; b=3; } else {a=x/3 1; b=x%3; (if ) y%3==0) {c=y/3; d=3; } else {c=y/3 1; d=y%3; } biao[a][b]=1; if(Biao[c][d] ) { cout'NO'endl; 布雷克; ) if(ac ) %2==0) bd ) %2==0) { biao[a][b]=1; biao[c][d]=1; into=(ac )/2; intp=(bd )/2; if(Biao[o][p]==0) ) { cout'NO'endl; 布雷克; } } else { biao[a][b]=1; biao[c][d]=1; } } }}