当前位置:网站首页>[错题]电路维修
[错题]电路维修
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。
边栏推荐
- How to make self-introduction
- 如何改变sys_guid() 返回值类型
- "Global Digital Economy Conference" landed in N World, Rongyun provides communication cloud service support
- Win10/11 删除文件资源管理器左侧栏目文件夹
- 如何通过DBeaver 连接 TDengine?
- 深入解析分布式文件系统的一致性的实现
- Simple implementation of a high-performance clone of Redis using .NET (1)
- DOM对象能干什么?
- ARIMA实现(亲测可用)
- 本周四晚19:00知识赋能第4期直播丨OpenHarmony智能家居项目之设备控制实现
猜你喜欢
随机推荐
微信多开批处理(自动获取安装路径)
OS层面包重组失败过高,数据库层面gc lost 频繁
Skills required to be a good architect: How to draw a system architecture that everyone will love?What's the secret?Come and open this article to see it!...
跨链桥协议 Nomad 遭遇黑客攻击,损失超 1.5 亿美元
【Star项目】小帽飞机大战(九)
MATLAB程序设计与应用 2.7 结构数据与单元数据
STM32+OLED显示屏制作指针式电子钟
Matplotlib
如何通过DBeaver 连接 TDengine?
机器学习(第一章)—— 特征工程
聊天app开发——防炸麦以及节省成本的内容鉴定方法
Activiti产生的背景和作用
谷歌实用插件分享
C#/VB.NET 从PDF中提取表格
servlet生命周期详解--【结合源码】
【多线程的相关内容】
二叉搜索树(搜索二叉树)模拟实现(有递归版本)
Skills required to be a good architect: How to draw a system architecture that everyone will love?What's the secret?Come and open this article to see it!...
试题G:单词分析 ← 第十一届蓝桥杯大赛第二场省赛赛题
Win10/11 删除文件资源管理器左侧栏目文件夹