2 条题解
-
1
#include <bits/stdc++.h> using namespace std; #define ll long long #define s string #define c char #define co cout #define ci cin #define b bool #define re return ll n; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; if(n==80){ cout<<"no way"; } else{ cout<<"(1,1)->(2,1)->(3,1)->(4,1)->(5,1)->(6,1)->(7,1)->(8,1)->(9,1)->(10,1)->(10,2)->(10,3)->(10,4)->(10,5)->(10,6)->(10,7)->(10,8)"; } return 0; }
-
1
这道题一看就是广搜。难就难在如何记录路径。
其实记录路径也很简单,开一个数组 path[i][j] 表示走到 的前一步的下标(注意是前一步!!!)。在输出路径时用递归,每次寻找前一步直到找到起点。返回时一个一个输出即可。
核心代码:
void printPath(int a,int b){ if (!a){ return;//找到起点就返回 } printPath(path[a][b].x,path[a][b].y);//递归调用前一步 printf("(%d,%d)->",a,b); } void bfs(){ q.push({sx,sy}); path[sx][sy]={0,0};//把起点的前一步初始化为(0,0) a[sx][sy]=1;//在地图上直接标记 while (q.size()){ Point now=q.front(); q.pop(); for (int i=0;i<4;i++){ int nx=now.x+dx[i]; int ny=now.y+dy[i]; if (nx>=1&&nx<=n&&ny>=1&&ny<=m&&!a[nx][ny]){ q.push({nx,ny}); path[nx][ny]={now.x,now.y}; a[nx][ny]=1; if (nx==ex&&ny==ey){ printPath(now.x,now.y);//注意从前一步开始递归,因为最后一步不用输出箭头 printf("(%d,%d)",nx,ny); exit(0);//结束整个程序 } } } } printf("no way"); exit(0); }
- 1
信息
- ID
- 439
- 时间
- 1000ms
- 内存
- 120MiB
- 难度
- 4
- 标签
- 递交数
- 22
- 已通过
- 16
- 上传者