HDU 1691
#include <iostream>
#include <cstring>
using namespace std;
int chessp[15][2]; // x shu ; y heng
int chess[11][10];
bool (*judgemove[15])(int xo, int yo, int xf, int yf);
bool fun1(int xo, int yo, int xf, int yf){
if((xo > 10 || xo < 8) || (yo > 6 || yo < 4) || (xf > 10 || xf < 8) || (yf > 6 || yf < 4))
return false;
int dir[4][2] = {{1,0}, {-1,0}, {0,-1}, {0,1}};
bool re = false;
for(int i = 0; i < 4; i++)
if(xf - xo == dir[i][0] && yf - yo == dir[i][1]){
re = true;
break;
}
return re;
}
bool fun8(int xo, int yo, int xf, int yf){
if((xo > 3 || xo < 1) || (yo > 6 || yo < 4) || (xf > 3 || xf < 1) || (yf > 6 || yf < 4))
return false;
bool re = false;
int dir[4][2] = {{1,0}, {-1,0}, {0,-1}, {0,1}};
for(int i = 0; i < 4; i++)
if(xf - xo == dir[i][0] && yf - yo == dir[i][1]){
re = true;
break;
}
return re;
}
bool fun2(int xo, int yo, int xf, int yf){
if((xo > 10 || xo < 8) || (yo > 6 || yo < 4) || (xf > 10 || xf < 8) || (yf > 6 || yf < 4))
return false;
int x = xf - xo;
int y = yf - yo;
return (x == 1 || x == -1) && (y == 1 || y == -1);
}
bool fun9(int xo, int yo, int xf, int yf){
if((xo > 3 || xo < 1) || (yo > 6 || yo < 4) || (xf > 3 || xf < 1) || (yf > 6 || yf < 4))
return false;
int x = xf - xo;
int y = yf - yo;
return (x == 1 || x == -1) && (y == 1 || y == -1);
}
bool fun3(int xo, int yo, int xf, int yf){
if((xo > 10 || xo < 6) || (yo > 9 || yo < 1) || (xf > 10 || xf < 6) || (yf > 9 || yf < 1))
return false;
if((xf - xo != 2 && xf - xo != -2)||(yf - yo != -2 && yf - yo != 2))
return false;
if(chess[xo+(xf-xo)/2][yo+(yf-yo)/2])
return false;
return true;
}
bool fun10(int xo, int yo, int xf, int yf){
if((xo > 5 || xo < 1) || (yo > 9 || yo < 1) || (xf > 5 || xf < 1) || (yf > 9 || yf < 1))
return false;
if((xf - xo != 2 && xf - xo != -2)||(yf - yo != -2 && yf - yo != 2))
return false;
if(chess[xo+(xf-xo)/2][yo+(yf-yo)/2])
return false;
return true;
}
bool fun4(int xo, int yo, int xf, int yf){
if((xo > 10 || xo < 1) || (yo > 9 || yo < 1) || (xf > 10 || xf < 1) || (yf > 9 || yf < 1))
return false;
int dir[8][2] = {{2,1}, {2,-1}, {-2,1}, {-2,1}, {1,2}, {1,-2}, {-1,2}, {-1,-2}};
bool re = false;
for(int i = 0; i < 8; i++)
if(xf-xo == dir[i][0] && yf-yo == dir[i][1]){
int x = (xf-xo)/2;
int y = (yf-yo)/2;
if(!chess[xo+x][yo+y])
re = true;;
}
return re;
}
bool fun11(int xo, int yo, int xf, int yf){
if((xo > 10 || xo < 1) || (yo > 9 || yo < 1) || (xf > 10 || xf < 1) || (yf > 9 || yf < 1))
return false;
bool re = false;
int dir[8][2] = {{2,1}, {2,-1}, {-2,1}, {-2,1}, {1,2}, {1,-2}, {-1,2}, {-1,-2}};
for(int i = 0; i < 8; i++)
if(xf-xo == dir[i][0] && yf-yo == dir[i][1]){
int x = (xf-xo)/2;
int y = (yf-yo)/2;
if(!chess[xo+x][yo+y])
re = true;;
}
return re;
}
bool fun5(int xo, int yo, int xf, int yf){
if((xo > 10 || xo < 1) || (yo > 9 || yo < 1) || (xf > 10 || xf < 1) || (yf > 9 || yf < 1))
return false;
bool noobstacled = true;
for(int i = xo+1; i < xf; i++)
if(chess[i][yo]){
noobstacled = false;
break;
}
for(int i = yo+1; i < yf; i++)
if(chess[xo][i]){
noobstacled = false;
break;
}
return noobstacled;
}
bool fun12(int xo, int yo, int xf, int yf){
if((xo > 10 || xo < 1) || (yo > 9 || yo < 1) || (xf > 10 || xf < 1) || (yf > 9 || yf < 1))
return false;
bool noobstacled = true;
for(int i = xo+1; i < xf; i++)
if(chess[i][yo]){
noobstacled = false;
break;
}
for(int i = yo+1; i < yf; i++)
if(chess[xo][i]){
noobstacled = false;
break;
}
return noobstacled;
}
bool fun6(int xo, int yo, int xf, int yf){
if((xo > 10 || xo < 1) || (yo > 9 || yo < 1) || (xf > 10 || xf < 1) || (yf > 9 || yf < 1))
return false;
int counter = 0;
for(int i = xo+1; i < xf; i++)
if(chess[i][yo])
counter++;
for(int i = yo+1; i < yf; i++)
if(chess[xo][i])
counter++;
if(counter == 1 && chess[xf][yf])
return true;
return false;
}
bool fun13(int xo, int yo, int xf, int yf){
if((xo > 10 || xo < 1) || (yo > 9 || yo < 1) || (xf > 10 || xf < 1) || (yf > 9 || yf < 1))
return false;
int counter = 0;
for(int i = xo+1; i < xf; i++)
if(chess[i][yo])
counter++;
for(int i = yo+1; i < yf; i++)
if(chess[xo][i])
counter++;
if(counter == 1 && chess[xf][yf])
return true;
return false;
}
bool fun7(int xo, int yo, int xf, int yf){
if((xo > 10 || xo < 1) || (yo > 9 || yo < 1) || (xf > 10 || xf < 1) || (yf > 9 || yf < 1) || xf > xo)
return false;
if(xo >= 6){
return (xo-xf == 1) && yo == yf;
}else{
int x = xf - xo < 0 ? xo - xf : xf - xo;
int y = yf - yo < 0 ? yo - yf : yf - yo;
return x + y == 1;
}
}
bool fun14(int xo, int yo, int xf, int yf){
if((xo > 10 || xo < 1) || (yo > 9 || yo < 1) || (xf > 10 || xf < 1) || (yf > 9 || yf < 1) || xf < xo)
return false;
if(xo <= 5){
return (xf-xo == 1) && yo == yf;
}else{
int x = xf - xo < 0 ? xo - xf : xf - xo;
int y = yf - yo < 0 ? yo - yf : yf - yo;
return x + y == 1;
}
}
bool duijiang(){
bool re = true;
if(chessp[1][1] == chessp[8][1]){
for(int i = chessp[1][0]-1; i > chessp[8][0]; i--)
if(chess[i][chessp[1][1]]){
re = false;
break;
}
}else
re = false;
return re;
}
bool sbwin(){
return (!chessp[1][1]) || (!chessp[8][1]);
}
bool judge(int flag, int xo, int yo, int xf, int yf)
{
if(chess[xo][yo] < 7*flag + 1 || chess[xo][yo] > 7*flag + 7 || sbwin())
return false;
bool temp = (*judgemove[chess[xo][yo]])(xo, yo, xf, yf);
chessp[chess[xo][yo]][0] = xf; chessp[chess[xo][yo]][1] = yf;
chessp[chess[xf][yf]][0] = chessp[chess[xf][yf]][1] = 0;
chess[xf][yf] = chess[xo][yo];
chess[xo][yo] = 0;
return temp && !duijiang();
}
void Initial()
{
judgemove[1] = fun1;
judgemove[2] = fun2;
judgemove[3] = fun3;
judgemove[4] = fun4;
judgemove[5] = fun5;
judgemove[6] = fun6;
judgemove[7] = fun7;
judgemove[8] = fun8;
judgemove[9] = fun9;
judgemove[10] = fun10;
judgemove[11] = fun11;
judgemove[12] = fun12;
judgemove[13] = fun13;
judgemove[14] = fun14;
}
int main()
{
int T, counter1 = 0;
cin >> T;
Initial();
while(++counter1 <= T){
memset(chessp, 0, sizeof(chessp));
memset(chess, 0, sizeof(chess));
for(int i = 1; i <= 10; i++)
for(int j = 1; j <= 9; j++){
cin >> chess[i][j];
if(chess[i][j]){
chessp[chess[i][j]][0] = i;
chessp[chess[i][j]][1] = j;
}
}
int xo, yo, xf, yf, N, K, counter2 = 0;
cin >> N >> K;
while(++counter2 <= N){
cin >> xo >> yo >> xf >> yf;
if(xo < 1 || xo > 10 || yo < 1 || yo > 9 || xf < 1 || xf > 10 || yf < 1 || yf > 9){
cout << "Case " << counter1 << ": Illegal move on step 1";
while(++counter2 <= N)
cin >> xo >> yo >> xf >> yf;
counter2--;
break;
}
if( !judge(K, xo, yo, xf, yf) ){
cout << "Case " << counter1 << ": Illegal move on step " << counter2;
while(++counter2 <= N)
cin >> xo >> yo >> xf >> yf;
counter2--;
break;
}
K = !K;
}
if(counter2 > N)
cout << "Case " << counter1 << ": Legal move";
if(counter1 < T)
cout << endl;
}
return 0;
}