跳马问题,只要把方向数组给写好了,一切都搞定。经典bfs #include <iostream> #include <cstring> #include <queue> using namespace std ; const int maxn = 8 + 2 ; struct Node { int r ; int c ; int step ; } node1 , node2 ; queue < Node > q ; bool visit[maxn][maxn] ; int dr[] = { -2 , -2 , -1 , -1 , 1 , 1 , 2 , 2 } ;//控制行方向 int dc[] = { -1 , 1 , -2 , 2 , -2 , 2 , -1 , 1 } ;//控制列方向 bool is_ok( int r , int c )//判断能不能跳 { if( c < 0 || r < 0 || c >= 8 || r >= 8 || visit[r][c] ) return false ; return true ; } bool is_ans( int c , int r , int ec , int er )//判断是否到达终点 { if( c != ec || r != er ) return false ; return true ; } void output( int bc , int br , int ec , int er , int ans )//输出答案 { cout << "To get from " << ( char )( bc + 'a' ) << br + 1 << " to " << ( char )( ec + 'a' ) << er + 1 << " takes " << ans << " knight moves." << endl ; return ; } void bfs( int bc , int br , int ec , int er ) { while( ! q.empty() ) q.pop() ;//清空队列 node1.c = bc ; node1.r = br ; node1.step = 0 ; q.push( node1 ) ; visit[br][bc] = true ; int ok = 0 ; int ans = 0 ; if( is_ans( bc , br , ec , er ) )//如果起点和终点相同,说明不需要走(即使测试数据没给,也应该要想到) cout << "To get from " << ( char )( bc + 'a' ) << br + 1 << " to " << ( char )( ec + 'a' ) << er + 1 << " takes 0 knight moves." << endl ; else { while( ! q.empty() ) { node1 = q.front() ; int r = node1.r ; int c = node1.c ; int s = node1.step ; for( int i = 0 ; i < 8 ; i++ )//八个方向 { int nr = r + dr[i] ; int nc = c + dc[i] ; if( is_ok( nr , nc ) ) { if( is_ans( nr , nc , er , ec ) ) { ok = 1 ; ans = s + 1 ; break ; } node2.r = nr ; node2.c = nc ; node2.step = s + 1 ; q.push( node2 ) ; visit[nr][nc] = true ; } } if( ok ) { output( bc , br , ec , er , ans ) ; break ; } q.pop() ; } } return ; } int main() { int map[200] ; memset( map , 0 , sizeof( map ) ) ; for( int i = 'a' ; i <= 'h' ; i++ ) map[i] = i - 'a' ; char bc ; int br ; char ec ; int er ; while( cin >> bc >> br >> ec >> er ) { memset( visit , 0 , sizeof( visit ) ) ; bfs( map[bc] , br - 1 , map[ec] , er - 1 ) ; } return 0 ; }