#include <iostream>
#include <ctime>
using namespace std;
int curr[9][9]=
{
{5,8,2,7,1,6,9,3,4},
{3,1,4,5,2,9,8,7,6},
{9,7,6,4,3,8,5,1,2},
{6,4,7,9,5,2,3,8,1},
{8,5,9,1,6,3,2,4,7},
{1,2,3,8,7,4,6,5,9},
{4,6,5,3,9,1,7,2,8},
{2,3,1,6,8,7,4,9,5},
{7,9,8,2,4,5,1,6,3},
};
bool can_input_A(int x, int y, int value) {
for(int i = 0; i < 9; i++) {
if (value == curr[x][i] || value == curr[i][y]) { return false; }
}
for (int i = (x/3)*3; i <= ((x/3)*3)+2; i++) {
for (int j = (y/3)*3; j <= ((y/3)*3)+2; j++) {
if (curr[i][j] == value) { return false; }
}
} return true;
}
bool check_A()
{
bool ret=true;
for(unsigned y=0;y<9;++y)
{
for(unsigned x=0;x<9;++x)
{
int value=curr[y][x];
curr[y][x]=0;
for(int i=1;i<9;++i) if((i==value)^(can_input_A(y,x,i))) ret=false;
curr[y][x]=value;
}
}
return ret;
}
bool can_input_B(int x,int y,int value)
{
for(int i=0;i<9;++i) if((value==curr[y][i])||(value==curr[i][x])) return false;
for(int dx=3*(x/3),dy=3*(y/3),py=dy;py<dy+3;++py)
{
for(int px=dx;px<dx+3;++px)
{
if(value==curr[py][px]) return false;
}
}
return true;
}
bool check_B()
{
bool ret=true;
for(unsigned y=0;y<9;++y)
{
for(unsigned x=0;x<9;++x)
{
int value=curr[y][x];
curr[y][x]=0;
for(int i=1;i<9;++i) if((i==value)^(can_input_B(x,y,i))) ret=false;
curr[y][x]=value;
}
}
return ret;
}
int main()
{
const unsigned testcount=30000;
clock_t tm;
bool fa=true;
tm=clock();
for(unsigned t=0;t<testcount;++t) fa&=check_A();
cout<<((clock()-tm)/(double)CLOCKS_PER_SEC)<<" sec ("<<fa<<")"<<endl;
bool fb=true;
tm=clock();
for(unsigned t=0;t<testcount;++t) fb&=check_B();
cout<<((clock()-tm)/(double)CLOCKS_PER_SEC)<<" sec ("<<fb<<")"<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3RpbWU+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgY3Vycls5XVs5XT0KICB7CiAgICAgezUsOCwyLDcsMSw2LDksMyw0fSwKICAgICB7MywxLDQsNSwyLDksOCw3LDZ9LAogICAgIHs5LDcsNiw0LDMsOCw1LDEsMn0sCiAgICAgezYsNCw3LDksNSwyLDMsOCwxfSwKICAgICB7OCw1LDksMSw2LDMsMiw0LDd9LAogICAgIHsxLDIsMyw4LDcsNCw2LDUsOX0sCiAgICAgezQsNiw1LDMsOSwxLDcsMiw4fSwKICAgICB7MiwzLDEsNiw4LDcsNCw5LDV9LAogICAgIHs3LDksOCwyLDQsNSwxLDYsM30sICAgICAKICB9OwogIApib29sIGNhbl9pbnB1dF9BKGludCB4LCBpbnQgeSwgaW50IHZhbHVlKSB7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgOTsgaSsrKSB7CiAgICAgICAgaWYgKHZhbHVlID09IGN1cnJbeF1baV0gfHwgdmFsdWUgPT0gY3VycltpXVt5XSkgeyByZXR1cm4gZmFsc2U7IH0KICAgIH0KICAgIGZvciAoaW50IGkgPSAoeC8zKSozOyBpIDw9ICgoeC8zKSozKSsyOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gKHkvMykqMzsgaiA8PSAoKHkvMykqMykrMjsgaisrKSB7CiAgICAgICAgICAgIGlmIChjdXJyW2ldW2pdID09IHZhbHVlKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgIH0KICAgIH0gcmV0dXJuIHRydWU7Cn0KCmJvb2wgY2hlY2tfQSgpCiAgewogICBib29sIHJldD10cnVlOwogICBmb3IodW5zaWduZWQgeT0wO3k8OTsrK3kpCiAgICAgewogICAgICBmb3IodW5zaWduZWQgeD0wO3g8OTsrK3gpCiAgICAgICAgewogICAgICAgICBpbnQgdmFsdWU9Y3Vyclt5XVt4XTsKICAgICAgICAgY3Vyclt5XVt4XT0wOwogICAgICAgICBmb3IoaW50IGk9MTtpPDk7KytpKSBpZigoaT09dmFsdWUpXihjYW5faW5wdXRfQSh5LHgsaSkpKSByZXQ9ZmFsc2U7CiAgICAgICAgIGN1cnJbeV1beF09dmFsdWU7CiAgICAgICAgfQogICAgIH0KICAgcmV0dXJuIHJldDsKICB9Cgpib29sIGNhbl9pbnB1dF9CKGludCB4LGludCB5LGludCB2YWx1ZSkKICB7CiAgIGZvcihpbnQgaT0wO2k8OTsrK2kpIGlmKCh2YWx1ZT09Y3Vyclt5XVtpXSl8fCh2YWx1ZT09Y3VycltpXVt4XSkpIHJldHVybiBmYWxzZTsKICAgZm9yKGludCBkeD0zKih4LzMpLGR5PTMqKHkvMykscHk9ZHk7cHk8ZHkrMzsrK3B5KQogICAgIHsKICAgICAgZm9yKGludCBweD1keDtweDxkeCszOysrcHgpCiAgICAgICAgewogICAgICAgICBpZih2YWx1ZT09Y3VycltweV1bcHhdKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgIH0KICAgcmV0dXJuIHRydWU7CiAgfQoKYm9vbCBjaGVja19CKCkKICB7CiAgIGJvb2wgcmV0PXRydWU7CiAgIGZvcih1bnNpZ25lZCB5PTA7eTw5OysreSkKICAgICB7CiAgICAgIGZvcih1bnNpZ25lZCB4PTA7eDw5OysreCkKICAgICAgICB7CiAgICAgICAgIGludCB2YWx1ZT1jdXJyW3ldW3hdOwogICAgICAgICBjdXJyW3ldW3hdPTA7CiAgICAgICAgIGZvcihpbnQgaT0xO2k8OTsrK2kpIGlmKChpPT12YWx1ZSleKGNhbl9pbnB1dF9CKHgseSxpKSkpIHJldD1mYWxzZTsKICAgICAgICAgY3Vyclt5XVt4XT12YWx1ZTsKICAgICAgICB9CiAgICAgfQogICByZXR1cm4gcmV0OwogIH0KCmludCBtYWluKCkKICB7CiAgIGNvbnN0IHVuc2lnbmVkIHRlc3Rjb3VudD0zMDAwMDsKICAgY2xvY2tfdCB0bTsKICAgCiAgIGJvb2wgZmE9dHJ1ZTsKICAgdG09Y2xvY2soKTsKICAgZm9yKHVuc2lnbmVkIHQ9MDt0PHRlc3Rjb3VudDsrK3QpIGZhJj1jaGVja19BKCk7CiAgIGNvdXQ8PCgoY2xvY2soKS10bSkvKGRvdWJsZSlDTE9DS1NfUEVSX1NFQyk8PCIgc2VjICgiPDxmYTw8IikiPDxlbmRsOwoKICAgYm9vbCBmYj10cnVlOwogICB0bT1jbG9jaygpOwogICBmb3IodW5zaWduZWQgdD0wO3Q8dGVzdGNvdW50OysrdCkgZmImPWNoZWNrX0IoKTsKICAgY291dDw8KChjbG9jaygpLXRtKS8oZG91YmxlKUNMT0NLU19QRVJfU0VDKTw8IiBzZWMgKCI8PGZiPDwiKSI8PGVuZGw7ICAgCiAgIAogICByZXR1cm4gMDsKICB9