写了一天,,真的是一天,但还是没AC 求指教!!!

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值