//搜尋題,王用寬搜解決,後用點和點的斜率解決,只有兩種情況,要麼1,要麼2。<br />//車直線判斷即可,要麼1,要麼2。<br />//象斜率判斷加所在格子的黑白情況進行判斷,我想出了一個好方法。行列同奇同偶,為白色,行列奇偶互異為黑色。<br />//象如果在黑色格子上,他永遠到不了白色格子,這是性質。<br />#include<iostream><br />#include<queue><br />using namespace std;<br />bool vis[64];<br />int dir[8][2] = {-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};//方向數組<br />struct chess<br />{<br />int coord;<br />int step;<br />chess(int Coord,int Step)<br />{coord = Coord;step = Step;}<br />};<br />bool legal(int x,int y)//判斷點的合法<br />{<br />if(x < 0 || x > 8 || y < 0 || y > 8)return false;<br />return true;<br />}<br />int king(int st,int ed)//寬搜<br />{<br />int x1,y1,x2,y2;<br />memset(vis,0,sizeof(vis));<br />x1 = st / 8;<br />y1 = st % 8;<br />queue<chess> q;<br />q.push(chess(st,0));<br />while(!q.empty())<br />{<br />if(q.front().coord == ed)return q.front().step;<br />int tx = q.front().coord / 8;<br />int ty = q.front().coord % 8;<br />int step = q.front().step;<br />q.pop();<br />for(int i = 0;i < 7;++i)<br />{<br />x2 = tx + dir[i][0];<br />y2 = ty + dir[i][1];<br />if(!vis[x2*8+y2] && legal(x2,y2))<br />{<br />vis[x2*8+y2] = 1;<br />q.push(chess(x2*8+y2,step+1));<br />}<br />}<br />}<br />}<br />int queen(int st,int ed)<br />{<br />int x1,y1,x2,y2;<br />x1 = st / 8;<br />y1 = st % 8;<br />x2 = ed / 8;<br />y2 = ed % 8;<br />if(x1 == x2 || y1 == y2)return 1;<br />else if(abs(x1-x2) == abs(y1-y2))return 1;<br />else return 2;<br />}<br />int rook(int st,int ed)<br />{<br />int x1,y1,x2,y2;<br />x1 = st / 8;<br />y1 = st % 8;<br />x2 = ed / 8;<br />y2 = ed % 8;<br />if(x1 == x2 || y1 == y2)return 1;<br />else return 2;<br />}<br />int bishop(int st,int ed)<br />{<br />int x1,y1,x2,y2,color1,color2;<br />x1 = st / 8;<br />y1 = st % 8;<br />x2 = ed / 8;<br />y2 = ed % 8;<br />if(abs(x1-x2) == abs(y1-y2))return 1;<br />if(x1 % 2 == y1 % 2)color1 = 1;<br />else color1 = 0;<br />if(x2 % 2 != y2 % 2)color2 = 0;<br />else color2 = 1;<br />if(color1 != color2)return -1;<br />else return 2;<br />}<br />int main()<br />{<br />//freopen("in.txt","r",stdin);<br />int T;<br />int st,ed;<br />char s1[3],s2[3];<br />scanf("%d",&T);<br />while(T--)<br />{<br />scanf("%s%s",s1,s2);<br />st = abs(s1[0] - 'h') + (s1[1] - '0') * 8;<br />ed = abs(s2[0] - 'h') + (s2[1] - '0') * 8;<br />if(st == ed)//唉,忽略了起點和中點一樣的情況,貢獻1WA<br />{<br />printf("0 0 0 0/n");<br />continue;<br />}<br />printf("%d ",king(st,ed));<br />printf("%d ",queen(st,ed));<br />printf("%d ",rook(st,ed));<br />int B = bishop(st,ed);<br />if(B == -1)printf("Inf/n");<br />else printf("%d/n",B);<br />}<br />return 0;<br />}