求助,和样例结果一样,提交0分
查看原帖
求助,和样例结果一样,提交0分
312498
AndreaDO楼主2021/2/5 16:31

献上代码

#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N=402;
int chess[N][N],n,m;
struct dire{
    int x,y;
}dire[N*N];//创建结构体存储坐标
//下过象棋应该知道马走日字形
//所以先列出怎么走的八个方向
//八个方向进行遍历,下面是遍历时+x和+y的值
int direX[8]={2,1,-1,-2,2,1,-1,-2},direY[8]={1,2,2,1,-1,-2,-2,-1};
/*方向如下图
             -2,-1   -2,1
      -1,-2                 -1,2
                 0,0
      1,-2                   1,2
             2,-1    2,1
*/
/*
本题思路,根据象棋马的走法,建立走的位置数组
然后把棋盘先全部初始化无法到(-1),开始点0
然后在开始点使用广度优先遍历,遍历能达到的点,并且赋值
同时注意边界处理,防止出现数组[-x][-y]或者大于数组[n][m]的情况
*/
int x,y;//初始点
//我们走完一个点就可以进入下一层,不需要回到上一层,
//那么,我们可以使用先进先出的队列来实现BFS算法
void bfs()
{
    int hh=0,tt=0;//队头和队尾
    dire[0]={x,y};//队列第一个就是开始点
    while(hh<=tt)
    {
        struct dire dd=dire[hh++];
        for(int i=0;i<8;i++)
        {
            int xx=dd.x+direX[i];
            int yy=dd.y+direY[i];
            if(xx>0&&xx<=n&&yy>0&&yy<=m&&chess[xx][yy]==-1)
            {
                chess[xx][yy]=chess[dd.x][dd.y]+1;
                dire[++tt]={xx,yy};
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
   cin>>n>>m>>x>>y;
    memset(chess,-1,sizeof chess);//初始化全为-1,所有点都没法到达
    chess[x][y]=0;//开始点为0
    bfs();//宽度优先搜索算法
    //输出棋盘遍历结果
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            printf("%-5d", chess[i][j]);
        cout<<endl;
    }
    return 0;
}

输出结果和格式应该没问题,但就是提交0分,求大佬解答疑惑

2021/2/5 16:31
加载中...