国际象棋-此题为什么错了

a330416020 2011-05-25 06:22:54
描述
在n*n的国际象棋棋盘中,给定一“马(Knight)”和一“后(Queen)”的位置,问“马”能否在m步之内(包括m步)到达“后”的位置?马的走法是:每步棋先横走或直走一格,然后再斜走一格,即走“日”字,没有“中国象棋”中“蹩马腿”的限制。比如在8*8的棋盘中,马的位置为(3, 5),则下一步可以落在(1 ,6)、(1, 4)、(2, 7)、(2, 3)、(4, 7)、(4, 3)、(5, 6)或(5, 4)。
输入
输入数据有3行,第一行为2个正整数n和m(n <=1000000,m<=256);第二行为2个正整数kx和ky,代表“马”所在的位置(1<=kx, ky<=n);第三行为2个正整数qx和qy,代表“后”所在的位置(1<=qx, qy<=n)。我们保证马和后的位置不会重叠。
输出
如果“马”能够在m步之内(包括m步)到达“后”的位置,则输出:
Knight can reach Queen within m moves!
否则输出:
Knight cannot reach Queen within m moves!
其中m为给定的马步数。
样例输入
8 2
3 5
7 4
样例输出
Knight cannot reach Queen within 2 moves!

代码:#include<iostream>
using namespace std;
int dir[8][2]={{-2,1},{-2,-1},{-1,2},{-1,-2},{2,1},{2,-1},{1,-2},{1,2}};
int a[3000005],b[3000005];
int kx,ky,qx,qy;
int n,m;
int flag=0;
int f=0;
void DFS(int i,int j,int step)
{
if(i>n||i<1||j>n||j<1||step>m)
{
return ;
}

if(step<=m&&i==qx&&j==qy)
{
if(f==0)
{
flag=1;
cout<<"Knight can reach Queen within "<<m<<" "<<"moves!"<<endl;
f=1;
}
return ;
}
if(flag==1)
return ;
int x,s1,s2;
for(x=0;x<8;x++)
{
s1=i+dir[x][0];
s2=j+dir[x][1];
int p,q;
p=s1+s2+1000000;
q=s1-s2+1000000;
if(a[p]==0&&b[q]==0)
{
a[p]=1;
b[q]=1;
DFS(s1,s2,++step);
--step;
a[p]=0;
b[q]=0;
}
}
}
int main()
{

cin>>n>>m;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
cin>>kx>>ky>>qx>>qy;
DFS(kx,ky,0);
if(flag==0)
cout<<"Knight cannot reach Queen within "<<m<<" "<<"moves!"<<endl;
return 0;
}
...全文
200 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjmlj2010 2011-05-25
  • 打赏
  • 举报
回复
马的“日子走法”
a330416020 2011-05-25
  • 打赏
  • 举报
回复
额,呵呵!
MichaelBomb 2011-05-25
  • 打赏
  • 举报
回复
SF 国际象棋 还没玩过。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧