象棋中的跳马问题

有一张p*q的棋盘,并且棋盘中有障碍物(用来限制马的行动,即中国象棋中的蹩马腿)。有一个棋子马(走“日”字形路线),要从起始点走到终点。

 

输入部分:

第一行输入一个整数n,表示有n组测试实例,每组测试数据第一行输入两个整数p和q,表示棋盘的大小(1<=p,q<=100),每组测试数据第二行输入4个整数x1,y1,x2,y2,表示马的起点和终点的坐标。第三行输入一个整数m,表示图中有多少障碍物,接着m行每行一个坐标,分别表示m个障碍物的位置坐标。

 

输出部分:

输出马从起始位置走到终点所需的最小步数。若马不能走到终点,输出“ can not reach!”

样例输入:

2
9 10
1 1 2 3
0
9 10
1 1 2 3
8
1 2
2 2
3 3
3 4
1 4
3 2
2 4
1 3

样例输出

1

 

 

can not reach!

 

#include <bits/stdc++.h>
using namespace std;
#define MAX 100
string ans[MAX];
int s[MAX][MAX];
int vis[MAX][MAX];
int dir[8][2]={-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2};
int barr[4][2]={-1,0,0,1,1,0,0,-1};
int x,y,x2,y2,i,q,p,n;
int t=0;
struct state{
	int x,y;
	int step;
}a; 
stringstream ss;
queue<state>Q;
int bfs(state st){
	state now,next;
	st.step=0;
	Q.push(st);
	vis[st.x][st.y]=1;
	while(!Q.empty()){
		now=Q.front();
		if(now.x==x2&&now.y==y2){
			ss.clear();
			ss<<now.step;
			ss>>ans[t++];//一次输入多组数据,输出多组结果 
		/*	cout<<now.step<<endl;*///一次输入一组数据,输出一组结果 
			return 0;
		}
		for(i=0;i<8;++i){
			next.x=now.x+dir[i][0];
			next.y=now.y+dir[i][1];
			next.step=now.step+1;
			if(next.x>0&&next.y>0&&next.x<=p&&next.y<=q)
			if(!vis[next.x][next.y]&&!s[next.x][next.y]&&!s[now.x+barr[i/2][0]][now.x+barr[i/2][1]]){
				Q.push(next);
				vis[next.x][next.y]=1;
			}
		}
		Q.pop();
	}
	/*cout<<"can not reach!"<<endl;*/
	ans[t++]="can not reach!";
} 	
int main() {
	int m,e,r;
	cin>>n;
	while(n--){
		Q=queue<state>();
		memset(s,0,sizeof(s));
		memset(vis,0,sizeof(vis));
		cin>>p>>q;
		cin>>x>>y>>x2>>y2;
		cin>>m;
		while(m--){
			cin>>e>>r;
			s[e][r]=1;
		}
		a.x=x;a.y=y;a.step=0;
		bfs(a);
	}
	for(i=0;i<t;i++)
	cout<<ans[i]<<endl;
	return 0;
}

 

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/Y_AOZHEN/article/details/79749266
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞