地址:
题意:按照国际象棋规则马最少几步从开始点走到终点。
mark:bfs,仔细。
代码:
#include#include int a[100][2],d[8][8];char p[5],q[5];void bfs(){ int front = 0,rear = 1,m,n; d[p[0]-'a'][p[1]-'0'-1] = 0; a[0][0] = p[0]-'a'; a[0][1] = p[1]-'0'-1; while(front != rear) { m = a[front][0]; n = a[front++][1]; if(m == q[0]-'a' && n == q[1]-'0'-1) return ; if(m > 1 && n > 0 && !d[m-2][n-1]) a[rear][0] = m-2, a[rear++][1] = n-1, d[m-2][n-1] = d[m][n]+1; if(m > 0 && n > 1 && !d[m-1][n-2]) a[rear][0] = m-1, a[rear++][1] = n-2, d[m-1][n-2] = d[m][n]+1; if(m > 1 && n < 7 && !d[m-2][n+1]) a[rear][0] = m-2, a[rear++][1] = n+1, d[m-2][n+1] = d[m][n]+1; if(m > 0 && n < 6 && !d[m-1][n+2]) a[rear][0] = m-1, a[rear++][1] = n+2, d[m-1][n+2] = d[m][n]+1; if(m < 7 && n > 1 && !d[m+1][n-2]) a[rear][0] = m+1, a[rear++][1] = n-2, d[m+1][n-2] = d[m][n]+1; if(m < 6 && n > 0 && !d[m+2][n-1]) a[rear][0] = m+2, a[rear++][1] = n-1, d[m+2][n-1] = d[m][n]+1; if(m < 7 && n < 6 && !d[m+1][n+2]) a[rear][0] = m+1, a[rear++][1] = n+2, d[m+1][n+2] = d[m][n]+1; if(m < 6 && n < 7 && !d[m+2][n+1]) a[rear][0] = m+2, a[rear++][1] = n+1, d[m+2][n+1] = d[m][n]+1; }}int main(){// freopen("in.txt", "r", stdin); while(~scanf("%s %s", p, q)) { memset(d, 0, sizeof(d)); bfs(); printf("To get from %s to %s takes %d knight moves.\n", p, q, d[q[0]-'a'][q[1]-'0'-1]); } return 0;}