Luogu 题目链接:https://www.luogu.org/problemnew/show/P1746
很典型的BFS的题目,按路径搜索即可。
思路:
没走过的就走,走完了标记,防止产生节点过多,一定会爆(来自小蒟蒻的温馨提醒)。
然后注意输入的格式,地图数据之间没有空格,因此不能用int数组,用char数组存吧,要不你也依次读入一个字符,转成int数组。
同时注意边界值吧
代码如下(小蒟蒻采用了一个只有十分其他全部RE的版本,因为小蒟蒻非常重视学术诚信):
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int n,ans; 5 int a1, a2, b1, b2; //起始位置和重点位置 6 char a[1001][1001]; //存图 7 int q[1000001][3]; //手打队列 8 int dx[4] = { -1,1,0,0 }; 9 int dy[4] = { 0,0,-1,1 }; //方向增量 10 bool vis[1001][1001]; 11 inline void bfs() 12 { 13 int tx, ty; 14 int head = 0, tail = 1; //头尾指针 15 q[1][0] = a1, q[1][1] = a2, q[1][2] = 0; //从a1,a2开始走,q[][0]代表行,q[][1]代表列,q[][2]代表已经用过的步数 16 while (head < tail) 17 { 18 ++head; 19 for (register int i = 0; i < 4; i++) //向四个方向扩展 20 { 21 tx = q[head][0] + dx[i]; 22 ty = q[head][1] + dy[i]; 23 if (tx == b1 && ty == b2) //如果已经到达了终点 24 { 25 ans = q[head][2] + 1; //因为到达终点还要再走一步,所以+1 26 return; //停止搜索 27 } 28 if (tx<1 || tx>n || ty<1 || ty>n || vis[tx][ty] || a[tx][ty]==‘1‘) //判断tx,ty是否越界,判重,和可不可以走 29 continue; 30 tail++; //都没有问题的话就入队 31 q[tail][0] = tx; 32 q[tail][1] = ty; 33 q[tail][2] = q[head][2] + 1; 34 vis[tx][ty] ^ 1; //标记 35 } 36 } 37 } 38 int main() 39 { 40 char c; 41 scanf("%d", &n); 42 for (register int i = 1; i <= n; i++) 43 for (register int j = 1; j <= n; j++) 44 cin>>a[i][j]; 45 scanf("%d %d %d %d", &a1, &a2, &b1, &b2); //读入,以防scanf函数读char类型出问题(主要是小蒟蒻技术辣鸡) 46 bfs(); 47 printf("%d", ans); //打印答案 48 return 0; 49 }
不过话说回来,这篇代码是在Microsoft visual studio 2017上写的,因为支持自动代码风格,所以有点丑,各位dalao见谅