洛谷 P1746 离开中山路

前几天做了一道广搜题,感觉搜索还是学的不好,于是做了一道广搜题。

首先看了看题,第一感觉是最短问题,也就是广度优先搜索,于是第一次提交。。。

emmm,RE了,应该是数组开太小了。

于是我开大数组.....

竟然WA了。。。肯定是哪里有问题。。。

首先看看30分的代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node{
    int x;//X坐标 
    int y;//Y坐标 
    int ans;//走的步数 
}a[101000];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};//四个方位 
int n;//地图大小 
int x1,y1,x2,y2;//初始XY坐标,需要到达的XY坐标 
char mp[5001][5001];//地图 
int book[5001][5001];//标记 
void bfs(int idx,int idy){
    int head=1,tail=2;
    a[head].x=idx;
    a[head].y=idy;
    a[head].ans=0;//初始化 
    while(head<tail){
        for(int i=0;i<4;i++){//枚举4个方位 
            int tx=a[head].x+dx[i];
            int ty=a[head].y+dy[i];//计算新的X,Y坐标 
            if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&map[tx][ty]=='0'){//判断越界,是否走过此点 
                a[tail].x=tx;
                a[tail].y=ty;//更新新的X,Y坐标
                a[tail].ans=a[head].ans+1;//步数++ 
                map[tx][ty]='1';//标记此点 
                tail++;//出现新元素 尾++ 
                if(tx==x2&&ty==y2){//如果找到了终点 
                    printf("%d
",a[head].ans+1);//输出步数 
                    return;
                }
            }
        }
        head++;
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>mp[i][j];
        } 
    }
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    //输入 
    map[x1][y1]='1';//标记初始点为走过 
    bfs(x1,y1);//搜索 
    return 0;
}

最开始我没有发现问题,于是就一直30分.....

悲惨的提交记录.....

我当时快要疯了,为什么一直30分,最后下了一个数据,发现较大的数据没有输出???

???????????

然后发现数组开小了..........

啊啊啊!!!!!

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node{
    int x;
    int y;
    int ans;
}a[1001000];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int n;
int xx,yy,xxx,yyy;
char mp[5001][5001];
void bfs(int idx,int idy,int fx,int fy){
    int head=1,tail=2;
    a[head].x=idx;
    a[head].y=idy;
    a[head].ans=0;
    mp[idx][idy]='1';
    while(head!=tail){
        for(int i=0;i<4;i++){
            int tx=a[head].x+dx[i];
            int ty=a[head].y+dy[i];
            if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&mp[tx][ty]=='0'){
                
                mp[tx][ty]='1';
                a[tail].x=tx;
                a[tail].y=ty;
                a[tail].ans=a[head].ans+1;
                tail++;
                if(tx==fx&&ty==fy){
                    cout<<a[head].ans+1<<endl;
                    return;
                } 
            }
        }
        head++;
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>mp[i][j];
        } 
    }
    cin>>xx>>yy>>xxx>>yyy;
    bfs(xx,yy,xxx,yyy);
    return 0;
}

因为我太懒所以就不发注释了。。

悲惨的提交记录:

总结的经验:

以后做搜索题,一定要开大数组!!!!!

如果有什么说的不好的地方,恳求大佬请教!

原文地址:https://www.cnblogs.com/shanxx/p/13156368.html