题 意:给定国际象棋棋盘,要求马从某点跳到某点,求最少步数 思 路:即BFS求最短路径长度 学习点:BFS 源代码: #include <stdio.h> #define MAXN 65 int fromRow, fromCol, toRow, toCol; int vis[MAXN][MAXN], dis[MAXN][MAXN], fa[MAXN][MAXN]; int q[MAXN * MAXN]; int dx[] = {-1, -2, -2, -1, 1, 2, 2, 1}; int dy[] = {-2, -1, 1, 2, -2, -1, 1, 2}; void funcInit(); void dfs(); int main() { char nStr1[5], nStr2[5]; while (2 == scanf("%s %s", nStr1, nStr2)) { fromRow = nStr1[0] - 'a'; fromCol = nStr1[1] - '1'; toRow = nStr2[0] - 'a'; toCol = nStr2[1] - '1'; funcInit(); dfs(); printf("To get from %s to %s takes %d knight moves./n", nStr1, nStr2, dis[toRow][toCol]); } return 0; } void funcInit() { int i, j; dis[fromRow][fromCol] = 0; for (i = 0; i != MAXN; ++i) { for(j = 0; j != MAXN ; ++j) { vis[i][j] = 0; } } } void dfs() { int i, v; int nR, nC; int rear = 0, front = 0; int cur = fromRow * 8 + fromCol; fa[fromRow][fromCol] = cur; vis[fromRow][fromCol] = 1; q[rear++] = cur; while (front != rear) { cur = q[front++]; fromRow = cur / 8; fromCol = cur % 8; for (i = 0; i != 8; ++i) { nR = fromRow + dx[i]; nC = fromCol + dy[i]; if (nR >= 0 && nR < 8 && nC >= 0 && nC < 8 && !vis[nR][nC]) { vis[nR][nC] = 1; v = nR * 8 + nC; q[rear++] = v; dis[nR][nC] = dis[fromRow][fromCol] + 1; } } } }