P1443 马的遍历

说来惭愧,第一次真正搞清了BFS

这个题特别像类似走迷宫的题目,主要借助STL中的queue

其中值得关注的几个点是

1该题钟的queue中存放的不是单个int,而是用make_pair(x,y)组成的一个节点,其中first和second分别存放当前点的x坐标和y坐标,这有一点像结构体。

2  第一次WA发生在这里int dx[8] = {1,1,2,2,-1,-1,-2,-2};    int dy[8] = {-2,2,-1,1,2,-2,1,-1};,因为粗心,没有对应上,把dy中的最后一个-1写成了1

3其实这种题更像是一种标准的框架


#include <bits/stdc++.h>

using namespace std;


int main()
{
    int n,m,x,y;
    cin>>n>>m>>x>>y;
    int f[405][405];
    bool visit[405][405];
    int dx[8] = {1,1,2,2,-1,-1,-2,-2};
    int dy[8] = {-2,2,-1,1,2,-2,1,-1};
    memset(f,-1,sizeof(f));
    memset(visit,false,sizeof(visit));
    queue<pair<int,int> > q;
    q.push(make_pair(x,y));
    visit[x][y] = true;
    f[x][y] = 0;
    while(!q.empty()){
        int xx = q.front().first;
        int yy = q.front().second;
        q.pop();
        for(int i = 0;i < 8;i++){
            int u = xx+dx[i];
            int v = yy+dy[i];
            if(u<1||u>n||v<1||v>m||visit[u][v]){
                continue;
            }
            else{
                f[u][v] = f[xx][yy] + 1;
                visit[u][v] = true;
                q.push(make_pair(u,v));
            }
        }
    }
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            printf("%-5d",f[i][j]);
        }
        if(i != n)
            printf("\n");
    }
    return 0;
}


 

4最后这一点我仍然没有搞清楚

最开始我是这么写的,我把负数特殊处理了一下,让他后面只输出四个空格,但是仍然WA了

使用cout<<setw(5)还是WA,因为setw(5)认为负数只占一位

    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            if(f[i][j] < 0)
                cout<<f[i][j]<<"    ";
            else
                cout<<f[i][j]<<"     ";
        }
        cout<<endl;
    }

 

用洛谷上的题解写法printf("%-5d",f[i][j])就过了,“%-5d”代表输出的这个数字最长只占五位,少的用空格补,左对齐

疑问:ASCII32 和我的空格字符串有什么区别吗?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值