一道ACM题目(象棋马的问题)

2025-03-03 08:14:16
推荐回答(1个)
回答1:

首先,,,,这个题离ACM的难度差远了,,,一个广搜~~
你的广搜在step的位置写错了,不是每进一个队列就加一,而且我也没看懂你的k循环是什么意思
下面的程序是我帮你把程序做了一些小的改动,可以AC,你看一下吧:

#include
using namespace std;
/********************************************/
bool visited[110][110];
bool barr[110][110];
int dir[8][2] = {{1,-2},{-1,-2},{-2,-1},{-2,1},
{-1,2},{1,2},{2,1},{2,-1}};
struct node{int x,y,s;};
node queue[200000];
int bfs(int xs, int ys, int xt, int yt, int p, int q);
/********************************************/
int bfs(int xs, int ys, int xt, int yt, int p, int q)
{
node tnode;
int head, tail, ttail;
int i, k, step=0,dx,dy;
head=-1, tail=0;
queue[0].x = xs;
queue[0].y = ys;
queue[0].s=0;//记录当前状态的步数

while(head < tail)
{
head++;
dx=queue[head].x; dy=queue[head].y;
for(i=0; i<8; i++)//分8个方向进行处理
{
if(i/2==0 && barr[dx][dy-1]==true){continue;}
if(i/2==1 && barr[dx-1][dy]==true){continue;}
if(i/2==2 && barr[dx][dy+1]==true){continue;}
if(i/2==3 && barr[dx+1][dy]==true){continue;}

tnode.x = dx+dir[i][0];
tnode.y = dy+dir[i][1];
if(tnode.x>=1 && tnode.x<=p && tnode.y>=1 && tnode.y<=q &&
!visited[tnode.x][tnode.y] && !barr[tnode.x][tnode.y])
{
queue[++tail].x = tnode.x;
queue[tail].y = tnode.y;
queue[tail].s=queue[head].s+1;
visited[tnode.x][tnode.y] = true;
if(xt==tnode.x && yt==tnode.y) return queue[tail].s;
}
}
}
return -1;
}
/********************************************/
int main()
{
int i, j, k;
int n, p, q, xs, ys, xt, yt, xb, yb, m, ans;
cin >> n;
while(n--)
{
memset(visited, false, sizeof(visited));
memset(barr, false, sizeof(barr));

cin >> p >> q;
cin >> xs >> ys >> xt >> yt;
cin >> m;
for(i=1; i<=m; i++)
{
cin >> xb >> yb;
barr[xb][yb] = true;
visited[xb][yb] = true;
}
if(xs==xt && ys==yt)
{
cout << "0\n";
continue;
}
ans = bfs(xs,ys,xt,yt,p,q);
if(ans==-1) cout<<"can not reach!\n";
else cout< }

// system("pause");
return 0;
}