moectf:A_game
说一下里面关于算法的一些内容吧:
行检索:
固定j的值为一到九的一个数,去和box里的一行进行比对,全部比对完成都没有到break那一步(k==8)输出错误,跳出整个程序

int j;
for(int i=0;i<9;i++){
for(int k=1;k<10;k++){
j=0;
while (box[i][j] != k){
if(j==8){
printf("Wrong!!!Try again!!!");
system("pause");
exit(0);
}
j++;
}
}
}
}
列检索

和行检索相似
void check2(){
int i;
for(int j=0;j<9;j++){
for(int k=1;k<10;k++){
i=0;
while (box[i][j] != k){
if(i==8){
printf("Wrong!!!Try again!!!");
system("pause");
exit(0);
}
i++;
}
}
}
}
九宫格检索
数独中除了需要保证行和列都是九个不同的数,还需要保证九宫格的不同


https://sudokusolving.bmcx.com/
在这个算法中,j和i仅用于跳转于不同的九宫格中,k用于判断九个数的不同,真正用于在九宫格走的是v5和v4(其实可以说是v4自己),当碰撞到九宫格边缘(2,2)时,还没有跳出,那就直接跳出整个程序
void check3(){
int i,j,k;
for(int x=0;x<9;x+=3){
for(int y=0;y<9;y+=3){
for(k=1;k<10;k++){
i=0;
j=0;
while(box[x+i][y+j] != k){
if(i==2 && j==2){
printf("Wrong!!!Try again!!!");
system("pause");
exit(0);
}
j++;
if(j==3){
i++;
j=0;
}
}
}
}
}
}
数独的填入

当遇见0时开始填入,由于输入的值是字符出串,为了保证后面计算顺利,需要改成字符(两个字符之间的距离)
所以我们需要找到数独结果(由于需要保证只有49个数,所以我们只需要输入0的内容)
用数独求解器输出结果
a=b"8291767138932581849755263447186268341129653538127"
magic=[
107, 2, 102, 112, 68, 105, 126, 110, 67, 74,
120, 74, 109, 96, 86, 0, 81, 89, 80, 67,
80, 81, 109, 116, 2, 85, 80, 82, 110, 111,
121, 64, 93, 75, 30, 25, 28, 116, 3, 84,
7, 76, 82, 106, 96, 80, 88, 64, 88, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0
]
for i in range(len(a)):
print(chr(a[i]^magic[i]),end="")
#moectf{S0_As_I_prAy_Un1imited_B1ade_WOrks---E1m1ya_Shir

浙公网安备 33010602011771号