一个象棋残局,红方有n(2<=n<=7) 个棋子,黑方只有一个将,红方除了帅,还可能有车,马,炮,并且要考虑“蹩马腿”,输入所有棋子的位置,保证局面合法并且红方已经将军,判断红方是否已经将黑方将死,
解题思路:
用一个棋盘保存红方可以打到的地方,看黑方将是否有其余的地方去,在竖直方向只要判断将能去的大方就可以,也就可以将帅和车一起判断,
#include#include #include #include using namespace std;char cb[12][10],ab[12][10];void RG(int a,int b){ //判断帅和车能到达的地方 int c; for(c=a-1;c>=1;c--){ ab[c][b]='S'; if(cb[c][b]!='A' && cb[c][b]!='B' ) break; } for(c=a+1;c<=3;c++){ ab[c][b]='S'; if(cb[c][b]!='A' && cb[c][b]!='B') break; } for(c=b+1;c<=9;c++){ ab[a][c]='S'; if(cb[a][c]!='A' && cb[a][c]!='B') break; } for(c=b-1;c>=1;c--){ ab[a][c]='S'; if(cb[a][c]!='A' && cb[a][c]!='B') break; }}void H(int a,int b){ //判断马可以去的地方 并且不能蹩马腿 if(cb[a][b+1]=='A'&&b+2<=9&&a-1>=1) ab[a-1][b+2]='S'; if(cb[a][b+1]=='A'&&b+2<=9&&a+1<11) ab[a+1][b+2]='S'; if(cb[a][b-1]=='A'&&b-2>=1&&a-1>=1) ab[a-1][b-2]='S'; if(cb[a][b-1]=='A'&&b-2>=1&&a+1<11) ab[a+1][b-2]='S'; if(cb[a+1][b]=='A'&&b-1>=1&&a+2<11) ab[a+2][b-1]='S'; if(cb[a+1][b]=='A'&&b+1<=9&&a+2<11) ab[a+2][b+1]='S'; if(cb[a-1][b]=='A'&&b-1>=1&&a-2>=1) ab[a-2][b-1]='S'; if(cb[a-1][b]=='A'&&b+1<=9&&a-2>=1) ab[a-2][b+1]='S';}void C(int a,int b){ //判断炮的位置 if(b>=4 && b<=6 && a==1){ //只需要判断在范围内的,外面的不考虑 if(cb[2][b]!='A' && cb[2][b]!='B') ab[3][b]='S'; } int c,d; //用两个循环判断中间是否有棋子,分别判断三个方向,面向红方帅的方向不用判断 for(c=a-1;c>=1;c--){ if(cb[c][b]=='B') return ; if(cb[c][b]!='A') break; } for(d=c-1;d>=1;d--){ ab[d][b]='S'; if(cb[d][b]!='A' && cb[d][b]!='B') break; } for(c=b+1;c<=9;c++){ if(cb[a][c]=='B') return; if(cb[a][c]!='A') break; } for(d=c+1;d<=9;d++){ ab[a][d]='S'; if(cb[a][d]!='A' && cb[a][d]!='B') break; } for(c=b-1;c>=1;c--){ if(cb[a][c]=='B') return ; if(cb[a][c]!='A') break; } for(d=c-1;d>=1;d--){ ab[a][d]='S'; if(cb[a][d]!='A' && cb[a][d]!='B') break; }}int judge(int i,int j){ //最后判断将的去处 int ok=1; if(i+1<=3 && ab[i+1][j]!='S') ok=0; if(i-1>=1 && ab[i-1][j]!='S') ok=0; if(j+1<=7 && ab[i][j+1]!='S') ok=0; if(j-1>=4 && ab[i][j-1]!='S') ok=0; return ok;}int main(){ int n,a1,b1; int Ch[8][3]; while(cin>>n>>a1>>b1&&n&&a1&&b1){ memset(cb,'A',sizeof(cb)); //起始棋盘 memset(ab,'A',sizeof(ab)); //目标棋盘 memset(Ch,0,sizeof(Ch)); //保存输入 cb[a1][b1]='B'; char ch; for(int k=0;k >ch>>i>>j; cb[i][j]=ch; Ch[k][0]=i; Ch[k][1]=j; } for(int m=0;m