//真是麻烦的一道题,从左到右,从上到下依次枚举每一个点,先判断后是否能够到达这个点 //(注意不能够越点,也就是要考虑后起点和终点之间不能存在其它点),若能够到达则继续判断 //是否能够将死的情况。由于只有一个王的情况下,王可以选择不动,所以白方移动后必须要形成 //对黑王攻击的局面。 #include<stdio.h> #include<string.h> #include<stdlib.h> int loc[3][2]; char tem[3][4]; int di[8][2]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1}; //判断皇后是否可达这个点 int arrive(int p,int q) { int i,j,max,min; max=q>loc[1][1]?q:loc[1][1]; min=q<loc[1][1]?q:loc[1][1]; //去掉已经被三个棋占用的点 for(i=0;i<3;i++) { if(loc[i][0]==p&&loc[i][1]==q) return 0; } //假设水平可达,若中间有子则不可达 if(p==loc[1][0]) { if(loc[0][0]==p&&loc[0][1]>min&&loc[0][1]<max) return 0; if(loc[2][0]==p&&loc[2][1]>min&&loc[2][1]<max) return 0; return 1; } max=p>loc[1][0]?p:loc[1][0]; min=p<loc[1][0]?p:loc[1][0]; //垂直方向 if(q==loc[1][1]) { if(loc[0][1]==q&&loc[0][0]>min&&loc[0][0]<max) return 0; if(loc[2][1]==q&&loc[2][0]>min&&loc[2][0]<max) return 0; return 1; } //对角线情况,主要注意在同一条对角线上,因为从一个点考虑对角线有2条 if(abs(p-loc[1][0])==abs(q-loc[1][1])) { max=q>loc[1][1]?q:loc[1][1]; min=q<loc[1][1]?q:loc[1][1]; if(abs(p-loc[0][0])==abs(q-loc[0][1])) { //确保三个点在同一对角线上 if(abs(loc[0][0]-p)+abs(loc[1][0]-loc[0][0])==abs(loc[1][0]-p)) return 0; } if(abs(p-loc[2][0])==abs(q-loc[2][1])) { if(abs(loc[2][0]-p)+abs(loc[2][0]-loc[1][0])==abs(loc[1][0]-p)) return 0; } return 1; } return 0; } int decide(int p,int q) { int i,x,y; //首先判断移动后的点是否能够攻击到黑方的王 if((p==loc[2][0]||q==loc[2][1]||abs(p-loc[2][0])==abs(q-loc[2][1]))||(abs(loc[0][0]-loc[2][0])<2/ &&abs(loc[0][1]-loc[2][1])<2)) ; else return 0; //考虑黑方移动后(八个方向)是否还有活路 for(i=0;i<8;i++) { x=loc[2][0]+di[i][0]; y=loc[2][1]+di[i][1]; if(x<=8&&x>0&&y<=8&&y>0) { ///考虑皇后移动后并且能被黑王吃掉,之后白王能否攻击黑王 if(x==p&&q==y) { if(abs(loc[0][0]-x)<2&&abs(loc[0][1]-y)<2) ; else return 0; } if((abs(loc[0][0]-x)<2&&abs(loc[0][1]-y)<2)||x==p||y==q||abs(x-p)==abs(y-q)) ; else return 0; } } return 1; } int main() { freopen("in.txt","r",stdin); freopen("ou.txt","w",stdout); while(scanf("%s%s%s",tem[0],tem[1],tem[2])==3) { int i,j,end=0; for(i=0;i<3;i++) { loc[i][0]=tem[i][0]-'a'+1; loc[i][1]=tem[i][1]-'0'; } for(i=1;i<=8;i++) { for(j=1;j<=8;j++) { if(arrive(i,j)&&decide(i,j)) { end=1; break; } } if(end) break; } if(end) printf("%c%d/n",i+'a'-1,j); else printf("no/n"); } return 0; }