时间限制:1秒 内存限制:128M
在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100×100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜。现在他请你帮忙,给你A、B两点的坐标,想知道两个位置到(1,1)点可能的最少步数。
提示:棋盘左上角坐标为(1,1),右下角坐标为(100,100)
A、B两点的坐标。
最少步数。
12 16 18 10
8 9
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int N=105;
const int M=10005;
int vis[N][N],step[N][N],f,r;
int q[M],q1[M];
int ax,ay,bx,by,as,bs;
int dx[]= {1,-1,2,-2,1,-1,2,-2,2,-2,-2,2};
int dy[]= {2,2,1,1,-2,-2,-1,-1,2,-2,2,-2};
void bfs(int x,int y) {
vis[x][y]=1;//起点标记入队
q[r] =x;
q1[r++] =y;
while(f100||yy<1||yy>100) {
continue;
}
if(vis[xx][yy]==0){
vis[xx][yy]=1;
q[r] =xx;
q1[r] =yy;
r++;
step[xx][yy]=step[tx][ty]+1;
}
}
f++;
}
}
int main() {
cin>>ax>>ay;
cin>>bx>>by;
bfs(ax,ay);
memset(vis,0,sizeof(vis));
memset(step,0,sizeof(step));
f=r=0;
bfs(bx,by);
return 0;
}