当前位置:网站首页>[错题]电路维修
[错题]电路维修
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。
边栏推荐
- 下午见!2022京东云数据库新品发布会
- 机器比人更需要通证
- Simple implementation of a high-performance clone of Redis using .NET (1)
- 图新地球为什么很模糊,白球、看图、下载问题深度剖析
- 【二分查找详解外加递归写法】附有全部代码
- [Star Project] Little Hat Plane Battle (9)
- What is a smart contract?
- Cookie和Session使用
- LyScript 实现对内存堆栈扫描
- Analysis of the idea of the complete knapsack problem
猜你喜欢

Analysis of the idea of the complete knapsack problem

2022年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

Classical Architecture and Memory Classification of Embedded Software Components

袋鼠云思枢:数驹 DTengine,助力企业构建高效的流批一体数据湖计算平台

MapReduce中ETL数据清洗案例

CADEditorX ActiveX 14.1.X

For invoice processing DocuWare, cast off the yoke of the paper and data input, automatic processing all the invoice received

苏州大学:从PostgreSQL到TDengine

如何改变sys_guid() 返回值类型

白帽黑客与留守儿童破壁对“画”!ISC、中国光华科技基金会、光明网携手启动数字安全元宇宙公益展
随机推荐
Question G: Word Analysis ← Questions for the second provincial competition of the 11th Blue Bridge Cup Competition
Classical Architecture and Memory Classification of Embedded Software Components
Basic using MySQL database
面试官:工作两年了,这么简单的算法题你都不会?
面试一面
【TypeScript】Why choose TypeScript?
servlet生命周期详解--【结合源码】
鸿蒙第四次
mysql数据库定时备份占用大量线程,导致全局锁表,有啥好的解决方法么
SAP 电商云 Spartacus UI 的 External Routes 设计明细
MySQL数据库基本使用
This article takes you to understand the principle of CDN technology
机器比人更需要通证
3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析
成为优秀架构师必备技能:怎样才能画出让所有人赞不绝口的系统架构图?秘诀是什么?快来打开这篇文章看看吧!...
Depth study of 100 cases - convolution neural network (CNN) to realize the clothing image classification
深度学习100例——卷积神经网络(CNN)实现服装图像分类
STM32+OLED显示屏制作指针式电子钟
如何将Oracle/MySQL中的数据迁移到GBase 8c中?
【LeetCode—第2题 两数之和 代码详解 】附有源码,可直接复制