AcWing 175. 电路维修
标签:lan 电路 amp 数组 ack ring nbsp 算法 solution
原题链接
考察:双端队列bfs
思路:
双端队列常用于距离只有0,1的情况.当距离为0时,更新的点放在队头.当距离为1时,更新的点放在队尾.
判断01距离不用写冗长的if代码.可以参照方向数组预设距离为0的斜杠应该有的方向.
这里当出队的距离才是确定了此点的最短距离.
1 #include 2 #include 3 #include 4 using namespace std;
5 const int N = 510;
6 typedef pairint,int> PII;
7 char mp[N][N];
8 int n,m,T,dist[N][N];
9 char pre[] = {"\\//\\"};
10 int xx[4] = {1,1,-1,-1},yy[4] = {1,-1,1,-1};
11 bool st[N][N];
12 int bfs(int sx,int sy)
13 {
14 deque q;
15 q.push_back({sx,sy});
16 memset(dist,0x3f,sizeof dist);
17 memset(st,0,sizeof st);
18 dist[sx][sy] = 0;
19 while(q.size())
20 {
21 PII it = q.front();//实际是模拟了dijkstra算法.距离短的放前面,这样第一次到的点就是最短的点.
22 int x= it.first,y = it.second;
23 q.pop_front();
24 if(st[x][y]) continue;//已经用此点更新过就没必要再更新.
25 st[x][y] = 1;
26 for(int i=0;i4;i++)
27 {
28 int dx = x+xx[i],dy = y+yy[i];
29 if(dx>0&&dx1&&dy>0&&dy1)
30 {
31 char c = mp[min(dx,x)][min(dy,y)];
32 int w = 1;
33 if(c==pre[i]) w = 0;
34 if(dist[dx][dy]>dist[x][y]+w)
35 {
36 dist[dx][dy] = dist[x][y]+w;
37 if(!w) q.push_front({dx,dy});
38 else q.push_back({dx,dy});
39 }
40 }
41 }
42 }
43 return dist[n+1][m+1];
44 }
45 int main()
46 {
47 scanf("%d",&T);
48 while(T--)
49 {
50 scanf("%d%d",&n,&m);
51 for(int i=1;i"%s",mp[i]+1);
52 if(n+m&1) puts("NO SOLUTION");
53 else printf("%d\n",bfs(1,1));
54 }
55 return 0;
56 }
AcWing 175. 电路维修
标签:lan 电路 amp 数组 ack ring nbsp 算法 solution
原文地址:https://www.cnblogs.com/newblg/p/14642703.html
评论