题意
国际象棋跳马 指定马的起点和终点 ,计算马最少需要多少步到达终点
Sample Input
e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6
Sample Output
To get from e2 to e4 takes 2 knight moves.
To get from a1 to b2 takes 4 knight moves.
To get from b2 to c3 takes 2 knight moves.
To get from a1 to h8 takes 6 knight moves.
To get from a1 to h7 takes 5 knight moves.
To get from h8 to a1 takes 6 knight moves.
To get from b1 to c3 takes 1 knight moves.
To get from f6 to f6 takes 0 knight moves.
bfs一遍即可
但是还是WA了,思维太不严密了。。
WA 1
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
#include <set>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <sstream>
#include <string>
#define maxn 30
using namespace std;
struct node {
int x;
int y;
node ( int x, int y) {
this -> x= x;
this -> y= y;
}
} ;
int go[ 8 ][ 2 ]= {{ 2 , 1 } , { 2 ,- 1 } , { - 2 , 1 } , { - 2 ,- 1 } , { 1 , 2 } , { 1 ,- 2 } , { - 1 , 2 } , { - 1 ,- 2 }} ;
int mp[ 9 ][ 9 ];
int bfs ( node f, node e) {
queue < node> q;
q. push ( f);
mp[ f. x][ f. y]= 0 ;
while (! q. empty ()) {
node p= q. front ();
q. pop ();
int x= p. x, y= p. y;
for ( int i = 0 ; i< 8 ; i++) {
int xx= x, yy= y;
xx+= go[ i][ 0 ];
yy+= go[ i][ 1 ];
if ( xx< 10 && xx> 0 && yy< 10 && yy> 0 ) {
if ( mp[ xx][ yy]!=- 1 )
mp[ xx][ yy]= min ( mp[ xx][ yy], mp[ x][ y]+ 1 );
else {
mp[ xx][ yy]= mp[ x][ y]+ 1 ;
q. push ( node ( xx, yy));
}
if ( xx== e. x&& yy== e. y)
return mp[ xx][ yy];
}
}
}
}
int main () {
char a[ 4 ], b[ 4 ];
while (~ scanf ( "%s%s" , a, b)) {
memset ( mp,- 1 , sizeof ( mp));
printf ( "To get from %s to %s takes %d knight moves. \n " , a, b, bfs ( node ( a[ 0 ]- 'a' + 1 , a[ 1 ]- '0' ), node ( b[ 0 ]- 'a' + 1 , b[ 1 ]- '0' )));
}
}
xx yy范围错误
AC代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
#include <set>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <sstream>
#include <string>
#define maxn 30
using namespace std;
struct node {
int x;
int y;
node ( int x, int y) {
this -> x= x;
this -> y= y;
}
} ;
int go[ 8 ][ 2 ]= {{ 2 , 1 } , { 2 ,- 1 } , { - 2 , 1 } , { - 2 ,- 1 } , { 1 , 2 } , { 1 ,- 2 } , { - 1 , 2 } , { - 1 ,- 2 }} ;
int mp[ 9 ][ 9 ];
int bfs ( node f, node e) {
queue < node> q;
q. push ( f);
mp[ f. x][ f. y]= 0 ;
while (! q. empty ()) {
node p= q. front ();
q. pop ();
int x= p. x, y= p. y;
for ( int i = 0 ; i< 8 ; i++) {
int xx= x, yy= y;
xx+= go[ i][ 0 ];
yy+= go[ i][ 1 ];
if ( xx< 9 && xx> 0 && yy< 9 && yy> 0 ) {
if ( mp[ xx][ yy]==- 1 ) {
mp[ xx][ yy]= mp[ x][ y]+ 1 ;
q. push ( node ( xx, yy));
}
if ( xx== e. x&& yy== e. y)
return mp[ xx][ yy];
}
}
}
return - 1 ;
}
int main () {
char a[ 4 ], b[ 4 ];
while (~ scanf ( "%s%s" , a, b)) {
memset ( mp,- 1 , sizeof ( mp));
printf ( "To get from %s to %s takes %d knight moves. \n " , a, b, bfs ( node ( a[ 0 ]- 'a' + 1 , a[ 1 ]- '0' ), node ( b[ 0 ]- 'a' + 1 , b[ 1 ]- '0' )));
}
}