洛谷 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\n",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; }
因为我太懒所以就不发注释了。。
悲惨的提交记录:
总结的经验:
以后做搜索题,一定要开大数组!!!!!
如果有什么说的不好的地方,恳求大佬请教!