当前位置:网站首页>[错题]电路维修
[错题]电路维修
2022-08-03 10:59:00 【wingaso】
WA代码
#include<bits/stdc++.h>
#define xx first
#define yy second
using namespace std;
typedef pair<int,int> pii;
const int N = 510;
string G[N];
int r,c;
int D[N][N];
const int d1[] = {
-1,-1,1, 1}; // 点
const int d2[] = {
-1, 1,1,-1};
const int k1[] = {
-1,-1,0, 0}; // 边
const int k2[] = {
-1, 0,0,-1};
const char kk[] = "\\/\\/";
int bfs(){
deque<pii> q;
memset(D,-1,sizeof D);
q.push_back({
0,0});
D[0][0] = 0;
while(!q.empty()){
int x = q.front().xx,y = q.front().yy;
q.pop_front();
if(x == r and y == c) break;
for(int i = 0;i < 4;i++){
int dx = x + d1[i],dy = y + d2[i];
int kx = x + k1[i],ky = y + k2[i];
if(dx < 0 or dy < 0 or dx > r or dy > c) continue;
if(~D[dx][dy]) continue;
if(G[kx][ky] == kk[i]){
D[dx][dy] = D[x][y];
q.push_front({
dx,dy});
}
else{
D[dx][dy] = D[x][y] + 1;
q.push_back({
dx,dy});
}
}
}
return D[r][c];
}
int main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t; cin >> t;
while(t--){
cin >> r >> c;
for(int i = 0;i < r;i++) cin >> G[i];
cout << bfs() << endl;
}
return 0;
}
AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<deque>
#define xx first
#define yy second
using namespace std;
typedef pair<int,int> pii;
const int N = 510;
string G[N];
int r,c;
int D[N][N];
const int d1[] = {
-1,-1,1, 1}; // 点
const int d2[] = {
-1, 1,1,-1};
const int k1[] = {
-1,-1,0, 0}; // 边
const int k2[] = {
-1, 0,0,-1};
const char kk[] = "\\/\\/";
bool st[N][N];
int bfs(){
if((r + c) % 2) return -1;
deque<pii> q;
memset(D,0x3f,sizeof D);
memset(st,false,sizeof st);
q.push_back({
0,0});
D[0][0] = 0;
st[0][0] = true;
while(!q.empty()){
int x = q.front().xx,y = q.front().yy;
q.pop_front();
st[x][y] = true;
if(x == r and y == c) break;
for(int i = 0;i < 4;i++){
int dx = x + d1[i],dy = y + d2[i];
int kx = x + k1[i],ky = y + k2[i];
if(dx < 0 or dy < 0 or dx > r or dy > c) continue;
if(st[dx][dy]) continue;
if(G[kx][ky] == kk[i] and D[dx][dy] > D[x][y]){
D[dx][dy] = D[x][y];
q.push_front({
dx,dy});
}
else if(G[kx][ky] != kk[i] and D[dx][dy] > D[x][y] + 1){
D[dx][dy] = D[x][y] + 1;
q.push_back({
dx,dy});
}
}
}
return D[r][c];
}
int main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t; cin >> t;
while(t--){
cin >> r >> c;
for(int i = 0;i < r;i++) cin >> G[i];
int res = bfs();
if(~res) cout << res << endl;
else cout << "NO SOLUTION" << endl;
}
return 0;
}
错误原因
错误原因是,误认为一个点第一次更新时的距离一定为最短距离。
这是一个假命题。
因为在每一次从队列中取出一个点 ( x , y ) (x,y) (x,y)时,会更新其相邻的四个点的"距离"。
当 D [ d x ] [ d y ] = D [ x ] [ y ] + 1 D[dx][dy] =D[x][y] + 1 D[dx][dy]=D[x][y]+1时,仍然不能排除能够从另外一个距离为 D [ t x ] [ t y ] = D [ x ] [ y ] D[tx][ty] = D[x][y] D[tx][ty]=D[x][y]的点 ( t x , t y ) (tx,ty) (tx,ty),以 0 0 0的代价从 ( t x , t y ) (tx,ty) (tx,ty)走到 ( d x , d y ) (dx,dy) (dx,dy)。
双端队列广搜,实际可以理解为dijkstra的简化版本。
我们每一次更新距离,即是一次松弛操作。
所以,我们可以仿照着,将初始距离设置为(理论上的)无穷大,然后在更新中使得最终取得的距离为最小距离。
因此,这里不能使用D数组作为是否需要更新该节点距离的判断依据,我们需要增加一个新的状态数组 s t st st。
边栏推荐
猜你喜欢

程序员架构修炼之道:软件架构基本概念和思维

出色的移动端用户验证
![[Detailed explanation of binary search plus recursive writing method] with all the code](/img/51/c4960575a59f8ca7f161b310e47b27.png)
[Detailed explanation of binary search plus recursive writing method] with all the code

使用.NET简单实现一个Redis的高性能克隆版(一)

Cross-chain bridge protocol Nomad suffers hacker attack, losing more than $150 million

后台图库上传功能
![[Star Project] Little Hat Plane Battle (9)](/img/e3/c7d2728080bcdccc181a7e5c50ee6f.png)
[Star Project] Little Hat Plane Battle (9)

鸿蒙第三次

redis基础知识总结——数据类型(字符串,列表,集合,哈希,集合)

Web Server 设置缓存响应字段的一些推荐方案
随机推荐
在安装GBase 8c数据库的时候,报错显示“Host ips belong to different cluster”。这是为什么呢?有什么解决办法?
2022年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多
【冒泡排序以及奇数偶数排列】
MySQL数据库基本使用
ETL data cleaning case in MapReduce
白帽黑客与留守儿童破壁对“画”!ISC、中国光华科技基金会、光明网携手启动数字安全元宇宙公益展
[Detailed explanation of binary search plus recursive writing method] with all the code
Who is more popular for hybrid products, depending on technology or market?
mysql数据库定时备份占用大量线程,导致全局锁表,有啥好的解决方法么
程序员架构修炼之道:软件架构基本概念和思维
二叉搜索树(搜索二叉树)模拟实现(有递归版本)
优炫数据库在linux平台下服务启动失败的原因
机器学习(公式推导与代码实现)--sklearn机器学习库
深入解析分布式文件系统的一致性的实现
redis基础知识总结——数据类型(字符串,列表,集合,哈希,集合)
FR9811S6 SOT-23-6 23V,2A同步降压DC/DC转换器
面试一面
袋鼠云思枢:数驹 DTengine,助力企业构建高效的流批一体数据湖计算平台
LyScript implements memory stack scanning
Depth study of 100 cases - convolution neural network (CNN) to realize the clothing image classification