象棋RE0分,求救!!!

题目描述

马走日,象走田,这是中国象棋的规则。鱼大大非常喜欢下中国象棋,也十分精通中国象棋,象棋中每个棋子都有自己对应的价值,如:车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;
}

应该是 STL 容器越界了

我该怎么解决? :pleading_face: :pleading_face: :pleading_face:

多一些判断,让无效的进入尽可能的少

问题在此::

:smile: :smile: :smile:

我很笨,看不懂呀!

第四个nx是ny

变成WA30分了,难

1改成0?

80,还差一点

a[nx][ny] == 1 不需要

#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

qu;
void bfs(int X,int Y){
v[Y]=1;
qu.push({X,Y,0});
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||ny>10||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;
}