广搜求条

P1746 离开中山路

违规用户名K&xs3Z^ @ 2024-08-20 09:00:38

#include<bits/stdc++.h>
using namespace std;
queue<int> x;
queue<int> y;
char a[1110][1110];
int step=-1,n,s1,t1,s2,t2;
bool vis[1110][1110];
int fx[6]={0,0,1,0,-1};
int fy[6]={0,1,0,-1,0};
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>a[i][j];
    cin>>s1>>t1>>s2>>t2;
    x.push(s1),y.push(t1);
    while(!x.empty()){
        for(int i=1;i<=4;i++){
        int tx=x.front()+fx[i];
        int ty=y.front()+fy[i];
        if(a[tx][ty]=='0'&&!vis[tx][ty]){
            vis[tx][ty]=1;
            a[tx][ty]='1';
            step++;
            x.push(tx),y.push(ty);
            if(tx==s2&&ty==t2){
                cout<<step<<endl;
                return 0;
            }
        }
        }
        x.pop(),y.pop();
    }
    return 0;
}

by 违规用户名K&xs3Z^ @ 2024-08-20 09:07:21

@FIRESTARS 所以这个用数组模拟更好一些是嘛?


by 违规用户名K&xs3Z^ @ 2024-08-20 09:07:47

@chenyunxi1 谢谢 已取关


by LikablePie79015 @ 2024-08-20 09:08:05

不能走一步就 step++ 啊,不然走到错误的格子会导致 step 无故增加,而且 step 初始化不能为 -1,你的样例能过是因为你没有标记起点导致多走了一次起点然后 step 多加了一次所以输出 4

正确做法应该是数组记录到达每个格子步数,省空间的话用 vis 数组记录就行。


by tireden @ 2024-08-20 09:08:38

@违规用户名K&xs3Z^ 当然,你也可以用结构体,不过数组更好


by LikablePie79015 @ 2024-08-20 09:10:20

@违规用户名K&xs3Z^

广搜当然用队列更好理解也更好学习。

当然数组结构体都行,看个人喜好。


by 违规用户名K&xs3Z^ @ 2024-08-20 09:10:43

@tireden 谢谢 用数组模拟AC 已关


by 违规用户名K&xs3Z^ @ 2024-08-20 09:10:52

@LikablePie79015 谢谢 用数组模拟AC 已关


by LikablePie79015 @ 2024-08-20 09:11:34

@违规用户名K&xs3Z^

没事,找到错误改对了就好。


by 违规用户名K&xs3Z^ @ 2024-08-20 09:12:08

@LikablePie79015 冒昧的问一下 这个用队列该怎么改呀 用结构体定义队列么?


by tireden @ 2024-08-20 09:12:31

@违规用户名K&xs3Z^ 对


上一页 | 下一页