28. 象棋
题目ID:9676必做题100分
最新提交:
Wrong Answer
70 分
历史最高:
Wrong Answer
70 分
时间限制: 500ms
空间限制: 65536kB
题目描述
【题目描述】
马走日,象走田,这是中国象棋的规则。鱼大大非常喜欢下中国象棋,也十分精通中国象棋,象棋中每个棋子都有自己对应的价值,如:车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代表该位置空或为将帅
输出格式
【输出格式】
象吃掉马时的步数
样例
Input 1
0 0 0 0 8 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 9 0 0 0 0 8 7 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0
Output 1
No!God!Please no!
Input 2
0 0 0 0 8 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 8 7 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0
Output 2
No!God!Please no!
下面是我的代码
#include <bits/stdc++.h>
using namespace std;
struct node{
int x,y,step;
};
int mapa[15][15];
int vis[15][15];
int dx[]={-4,-3,-1,0,1,3,4,3,1,0,-1,-3};
int dy[]={0,-1,-3,-4,-3,-1,0,1,3,4,3,1};
int sx,sy,ex,ey;
void bfs(int x,int y){
queue <node> q;
q.push(node {x,y,0});
while(!q.empty()){
node now=q.front();
q.pop();
for(int i=0;i<12;i++){
int xx=now.x+dx[i],yy=now.y+dy[i];
if(xx==ex&&yy==ey){
cout<<now.step+1;
return;
}
if(xx>0&&xx<10&&yy>0&&yy<9&&vis[xx][yy]!=1){
vis[xx][yy]=1;
q.push(node{xx,yy,now.step+1});
}
}
}
cout<<"No!God!Please no!";
}
int main(){
memset(vis,-1,sizeof vis);
for(int i=1;i<=10;i++){
for(int j=1;j<=9;j++){
cin>>mapa[i][j];
if(mapa[i][j]==7){
sx=i;
sy=j;
}
if(mapa[i][j]==4){
ex=i;
ey=j;
}
}
}
bfs(sx,sy);
cout<<endl;
return 0;
}
哪位大神告诉我为什么只有70分