P7185 [CRCI2008-2009] CIJEVI
私题里有 \(3\) 组 hack.
还得是中模拟。
从 M
或者 Z
遍历整个管道,若遇到断点。断点有两种情况,若与 M
或者 Z
不直接接触,枚举附近的一个九宫格,找到接口,匹配管道构建块即可。此时你可以通过除 hack 外的所有数据。
若直接接触,枚举 M
或者 Z
附近的一个九宫格,找到接口,匹配管道构建块即可。此时你可以通过我的 hack。
若图中没有管道构建块,如:
1 3
M.Z
您可以将 M
与 Z
看作一个 +
型管道构建块,匹配管道接口即可。此时,你可以通过本题的所有数据。
具体看代码吧。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int xm,ym,xz,yz;
char a[26][26];
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
int f[4];
bool flag[26][26];
void dfs(int lx,int ly,int x,int y){
if(x<1||x>n||y<1||y>m||flag[x][y]) return;
flag[x][y]=1;
if(a[x][y]=='.'){
cout<<x<<' '<<y<<' ';
for(int i=0;i<=3;i++){
int px=x+dx[i],py=y+dy[i];
if(i==0&&(a[px][py]=='|'||a[px][py]=='+'||a[px][py]=='1'||a[px][py]=='4')) f[i]=1;
if(i==1&&(a[px][py]=='|'||a[px][py]=='+'||a[px][py]=='2'||a[px][py]=='3')) f[i]=1;
if(i==2&&(a[px][py]=='-'||a[px][py]=='+'||a[px][py]=='1'||a[px][py]=='2')) f[i]=1;
if(i==3&&(a[px][py]=='-'||a[px][py]=='+'||a[px][py]=='3'||a[px][py]=='4')) f[i]=1;
if(a[px][py]=='M'||a[px][py]=='Z') f[i]=1;
//上下左右
}
if(f[0]==1&&f[1]==1&&f[2]==0&&f[3]==0) {cout<<'|';exit(0);}
if(f[0]==0&&f[1]==0&&f[2]==1&&f[3]==1) {cout<<'-';exit(0);}
if(f[0]==1&&f[1]==1&&f[2]==1&&f[3]==1) {cout<<'+';exit(0);}
if(f[0]==0&&f[1]==1&&f[2]==0&&f[3]==1) {cout<<'1';exit(0);}
if(f[0]==1&&f[1]==0&&f[2]==0&&f[3]==1) {cout<<'2';exit(0);}
if(f[0]==1&&f[1]==0&&f[2]==1&&f[3]==0) {cout<<'3';exit(0);}
if(f[0]==0&&f[1]==1&&f[2]==1&&f[3]==0) {cout<<'4';exit(0);}
}
if(a[x][y]=='|'){
if(lx>x) dfs(x,y,x-1,y);
else dfs(x,y,x+1,y);
}
else if(a[x][y]=='-'){
if(ly<y) dfs(x,y,x,y+1);
else dfs(x,y,x,y-1);
}
else if(a[x][y]=='+'){
if(lx>x) {dfs(x,y,x-1,y),dfs(x,y,x,y-1),dfs(x,y,x,y+1);}
else if(lx<x) {dfs(x,y,x+1,y),dfs(x,y,x,y-1),dfs(x,y,x,y+1);}
else if(ly<y) {dfs(x,y,x-1,y),dfs(x,y,x+1,y),dfs(x,y,x,y+1);}
else if(ly>y) {dfs(x,y,x,y-1),dfs(x,y,x+1,y),dfs(x,y,x-1,y);}
}
else if(a[x][y]=='1') {
if(ly>y) dfs(x,y,x+1,y);
else if(lx>x) dfs(x,y,x,y+1);
}
else if(a[x][y]=='2') {
if(lx<x) dfs(x,y,x,y+1);
else dfs(x,y,x-1,y);
}
else if(a[x][y]=='3'){
if(ly<y) dfs(x,y,x-1,y);
else dfs(x,y,x,y-1);
}
else if(a[x][y]=='4'){
if(ly<y) dfs(x,y,x+1,y);
else dfs(x,y,x,y-1);
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='Z') xz=i,yz=j;
if(a[i][j]=='M') xm=i,ym=j;
}
}
bool fla=0;//从 M 开始找通向远方的道路。
for(int i=0;i<=3;i++){
int px=xm+dx[i],py=ym+dy[i];
if(i==0&&(a[px][py]=='|'||a[px][py]=='+'||a[px][py]=='1'||a[px][py]=='4')) dfs(xm,ym,px,py),fla=1;
if(i==1&&(a[px][py]=='|'||a[px][py]=='+'||a[px][py]=='2'||a[px][py]=='3')) dfs(xm,ym,px,py),fla=1;
if(i==2&&(a[px][py]=='-'||a[px][py]=='+'||a[px][py]=='1'||a[px][py]=='2')) dfs(xm,ym,px,py),fla=1;
if(i==3&&(a[px][py]=='-'||a[px][py]=='+'||a[px][py]=='3'||a[px][py]=='4')) dfs(xm,ym,px,py),fla=1;
}
if(fla){//找到了路,但断点与 Z 接触。
if(flag[xz-2][yz]==1) cout<<'|';
else if(flag[xz+2][yz]==1) cout<<'|';
else if(flag[xz][yz+2]==1) cout<<'-';
else if(flag[xz][yz-2]==1) cout<<'-';
else if(flag[xz-1][yz-1]==1) {
if(a[xz][yz-1]=='.') cout<<2;
else cout<<4;
}
else if(flag[xz-1][yz+1]==1) {
if(a[xz-1][yz]=='.') cout<<1;
else cout<<3;
}
else if(flag[xz+1][yz-1]==1) {
if(a[xz][yz-1]=='.') cout<<1;
else cout<<3;
}
else if(flag[xz+1][yz+1]==1) {
if(a[xz][yz+1]=='.') cout<<4;
else cout<<2;
}
}
else{//没找到路
for(int i=0;i<=3;i++){//从 Z 开始找通向远方的道路。
int px=xz+dx[i],py=yz+dy[i];
if(i==0&&(a[px][py]=='|'||a[px][py]=='+'||a[px][py]=='1'||a[px][py]=='4')) dfs(xz,yz,px,py),fla=1;
if(i==1&&(a[px][py]=='|'||a[px][py]=='+'||a[px][py]=='2'||a[px][py]=='3')) dfs(xz,yz,px,py),fla=1;
if(i==2&&(a[px][py]=='-'||a[px][py]=='+'||a[px][py]=='1'||a[px][py]=='2')) dfs(xz,yz,px,py),fla=1;
if(i==3&&(a[px][py]=='-'||a[px][py]=='+'||a[px][py]=='3'||a[px][py]=='4')) dfs(xz,yz,px,py),fla=1;
}
if(fla){//找到了路,但断点与 M 接触。
if(flag[xm-2][ym]==1) cout<<'|';
else if(flag[xm+2][ym]==1) cout<<'|';
else if(flag[xm][ym+2]==1) cout<<'-';
else if(flag[xm][ym-2]==1) cout<<'-';
else if(flag[xm-1][ym-1]==1) {
if(a[xm][ym-1]=='.') cout<<2;
else cout<<4;
}
else if(flag[xm-1][ym+1]==1) {
if(a[xm-1][ym]=='.') cout<<1;
else cout<<3;
}
else if(flag[xm+1][ym-1]==1) {
if(a[xm][ym-1]=='.') cout<<1;
else cout<<3;
}
else if(flag[xm+1][ym+1]==1) {
if(a[xm][ym+1]=='.') cout<<4;
else cout<<2;
}
}
else{//图中没有管道构建块
flag[xz][yz]=flag[xm][ym]=1;//当作 + 型管道构建块处理。
if(flag[xm-2][ym]==1) cout<<xm-1<<' '<<ym<<' '<<'|';
else if(flag[xm+2][ym]==1) cout<<xm+1<<' '<<ym<<' '<<'|';
else if(flag[xm][ym+2]==1) cout<<xm<<' '<<ym+1<<' '<<'-';
else if(flag[xm][ym-2]==1) cout<<xm<<' '<<ym-1<<' '<<'-';
else if(flag[xm-1][ym-1]==1) {
if(a[xm][ym-1]=='.') cout<<xm<<' '<<ym-1<<' '<<2;
else cout<<xm-1<<' '<<ym<<' '<<4;
}
else if(flag[xm-1][ym+1]==1) {
if(a[xm-1][ym]=='.') cout<<xm-1<<' '<<ym<<' '<<1;
else cout<<xm<<' '<<ym+1<<' '<<3;
}
else if(flag[xm+1][ym-1]==1) {
if(a[xm][ym-1]=='.') cout<<xm<<' '<<ym-1<<' '<<1;
else cout<<xm+1<<' '<<ym<<' '<<3;
}
else if(flag[xm+1][ym+1]==1) {
if(a[xm][ym+1]=='.') cout<<xm<<' '<<ym+1<<' '<<4;
else cout<<xm+1<<' '<<ym<<' '<<2;
}
}
}
return 0;
}
P7185 [CRCI2008-2009] CIJEVI的更多相关文章
- BZOJ 2039: [2009国家集训队]employ人员雇佣
2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1369 Solved: 667[Submit ...
- Step by Step 安装 BizTalk Server 2009
原创地址:http://www.cnblogs.com/jfzhu/p/4020444.html 转载请注明出处 演示环境为Windows Server 2008 Enterprise, SQL Se ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- BZOJ 2463: [中山市选2009]谁能赢呢?
2463: [中山市选2009]谁能赢呢? Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1887 Solved: 1390[Submit][Sta ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7676 Solved: 3509[Subm ...
- SACS +Petrel 2009地震
Bentley SACS V8i SS4 05.07.01.01 海洋平台分析Schlumberger Petrel 2009地震解释油藏模拟课程 Trimble Tekla Structural D ...
- 彻底卸载 RAD Studio 2009/2010/XE
彻底卸载 RAD Studio 2009/2010/XE: 控制面板-->添加/删除程序中执行了卸载操作以后, 还需要做以下工作: 1. 删除以下目录(注意有些目录是隐藏的): %ALLUSER ...
- DataSnap 2009 系列之三 (生命周期篇)
DataSnap 2009 系列之三 (生命周期篇) DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置 当DSServer启动时从DSServerClass组 ...
- 莫队算法 2038: [2009国家集训队]小Z的袜子(hose)
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 ...
- Delphi 2009 泛型容器单元(Generics.Collections)[1]: TList<T>
Delphi 2009 新增了泛型容器单元: Generics.Collections, 同时还有一个 Generics.Defaults 单元做支持. Generics.Collections 包含 ...
随机推荐
- 解决CondaError: Run 'conda init' before 'conda activate'
前言 使用 Anaconda 激活 python 环境,报错: conda activate deepseek7B CondaError: Run 'conda init' before 'conda ...
- Kubernetes v1.16.3版本开启 Job ttlSecondsAfterFinished 自动清理机制
前言 Kubernetes v1.23 之前,Job 在处于 Completed 后,默认是不会被清理的. 完成的 Job 通常不需要留存在系统中.在系统中一直保留它们会给 API 服务器带来额外的压 ...
- 解决macOS无法验证“xxx”的开发者。你确定要打开它吗?
前言 当 macOS 无法验证开发者时,有两种方式解决,可以通过以下步骤来打开 xxx 系统偏好设置: 打开"系统偏好设置". 选择"安全性与隐私". 在&qu ...
- IM服务器:一个使用imserver服务器进行聊天的web端案例
该案例中包含一个基于web网页的前端程序,该案例会使用websocket与IM服务器(imserver)进行通信. 一.环境准备 1.下载 "imserver网页调用案例",并解压 ...
- 使用SVM在数字验证码识别中的应用研究课程报告
第1章 概要设计 1.1 设计目的 支持向量机作为一类强大的监督学习模型,以其出色的泛化能力,在手写数字识别.面部检测.图像分类等多个领域展现出了其优越性.其在处理小样本.非线性及高维模式识别任务中表 ...
- 队列的实现方式(先进先出 FIFO)--环形队列
博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- class Queue: def __init__(self, size= ...
- “决策-寻找过程”的黄金秘密工具,1/e 法则之应用(尤其日常生活中的应用)
https://www.ccgxk.com/magicword/327.html 目录 引言 著名的 1/e 法则内容和解释 应用到生活中的 1/e 法则是什么样? 相亲案例 看书.看电影案例 生活质 ...
- EntityFramework 6 分页模式
在我的另一篇博客中提到了EntityFrameworkCore 分页问题, 中提到了EntityFrameworkCore在针对不同版本SQL Server数据库时如何指定分页模式,那么如何在Enti ...
- SLAM导航全栈书的正确打开姿势
SLAM导航全栈书的正确打开姿势 随着人工智能.机器人.无人驾驶等技术的蓬勃发展,作为底层技术基石的SLAM也逐渐被大家所熟知.人工智能技术如果仅仅停留在虚拟的网络和数据之中的话,那么它挖掘并利用知识 ...
- 写给自己的话,学院派 C 转 实用派Java
本人计算机专业出身,学校学习过C / VC++. 写过很一般的代码, 刷过北大百炼 ACM 的部分试题.学过数据结(还可以),数据库(学的一般会用sql).用 c指针链表构建过二叉树实现过哈夫曼编码加 ...