题目描述
马走日,象走田,这是中国象棋的规则。鱼大大非常喜欢下中国象棋,也十分精通中国象棋,象棋中每个棋子都有自己对应的价值,如:车9分,马炮4.5分,士象3分,兵1分,过河兵2分。但是他认为象棋中有一个非常bug的点,就是马居然比象更厉害,价值更高?!以象命名的象棋中的象居然过的这么惨,这不科学!于是他自己设定了一个修改版的象棋,增强了“象”,使其比“马”更加灵活厉害。
修改后。每个子的价值如下:将帅0分(将帅要是都没了,还算啥分呀),车9分,炮8分,象7分,马4分,士3分,兵1分,过河兵2分。其中,象可以走4格直线或者走目字走田字,并且无象脚(不会被其他子阻挡)还可过河,其余棋子移动规则不变。终于!象被无限加强了,是时候向马儿复仇了!现给出一残局,在马不动的情况下,问象最少几步可以吃掉马?如果吃不到马则输出“No!God!Please no!”。
说明:象马出现位置随机,保证残局有且只有一象一马,象可以吃掉任意棋子(即若象移动后的落点位有棋子,会直接吃掉并落点)
注:象走说明:以下图为例,此时第5行第3列的黑象有13个落点位在棋盘内,可直接走过去,还有3个落点位在棋盘外,不可走。
输入格式
一个10*9的二维数组,表示象棋棋盘,其中,数字对应各棋子的分数,0代表该位置空或为将帅
输出格式
象吃掉马时的步数
#include<bits/stdc++.h>
using namespace std;
struct p{
int x,y,s;
};
int a[15][15],x,y,v[15][15],m,d;
int dx[]={-4,-3,-2,-1,0,1,2,3,4,3,2,1,0,-1,-2,-3};
int dy[]={0,-1,-2,-3,-4,-3,-2,-1,0,1,2,3,4,3,2,1};
queue<p>qu;
void bfs(int X,int Y){
v[X][Y]=1;
qu.push({X,Y,1});
while(!qu.empty()){
p n=qu.front();
qu.pop();
if(n.x==m&&n.y==d){
cout<<n.s;
return;
}
for(int i=0;i<16;i++){
int nx=n.x+dx[i],ny=n.y+dy[i];
if(nx<0||ny<0||nx>9||nx>8||a[nx][ny]==1||v[nx][ny]==1)continue;
v[nx][ny]=1;
qu.push({nx,ny,n.s+1});
}
}
cout<<"No!God!Please no!";
}
int main(){
for(int i=1;i<=10;i++){
for(int j=1;j<=9;j++){
cin>>a[i][j];
if(a[i][j]==7){
x=i;
y=j;
}
if(a[i][j]==4){
m=i;
d=j;
}
}
}
bfs(x,y);
return 0;
}