hack&&虐题解爽!

私题里有 \(3\) 组 hack.

还得是中模拟。

M 或者 Z 遍历整个管道,若遇到断点。断点有两种情况,若与 M 或者 Z 不直接接触,枚举附近的一个九宫格,找到接口,匹配管道构建块即可。此时你可以通过除 hack 外的所有数据。

若直接接触,枚举 M 或者 Z 附近的一个九宫格,找到接口,匹配管道构建块即可。此时你可以通过我的 hack。

若图中没有管道构建块,如:

1 3
M.Z

您可以将 MZ 看作一个 + 型管道构建块,匹配管道接口即可。此时,你可以通过本题的所有数据。

具体看代码吧。

#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的更多相关文章

  1. BZOJ 2039: [2009国家集训队]employ人员雇佣

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1369  Solved: 667[Submit ...

  2. Step by Step 安装 BizTalk Server 2009

    原创地址:http://www.cnblogs.com/jfzhu/p/4020444.html 转载请注明出处 演示环境为Windows Server 2008 Enterprise, SQL Se ...

  3. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  4. BZOJ 2463: [中山市选2009]谁能赢呢?

    2463: [中山市选2009]谁能赢呢? Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1887  Solved: 1390[Submit][Sta ...

  5. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...

  6. SACS +Petrel 2009地震

    Bentley SACS V8i SS4 05.07.01.01 海洋平台分析Schlumberger Petrel 2009地震解释油藏模拟课程 Trimble Tekla Structural D ...

  7. 彻底卸载 RAD Studio 2009/2010/XE

    彻底卸载 RAD Studio 2009/2010/XE: 控制面板-->添加/删除程序中执行了卸载操作以后, 还需要做以下工作: 1. 删除以下目录(注意有些目录是隐藏的): %ALLUSER ...

  8. DataSnap 2009 系列之三 (生命周期篇)

    DataSnap 2009 系列之三 (生命周期篇) DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置 当DSServer启动时从DSServerClass组 ...

  9. 莫队算法 2038: [2009国家集训队]小Z的袜子(hose)

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 ...

  10. Delphi 2009 泛型容器单元(Generics.Collections)[1]: TList<T>

    Delphi 2009 新增了泛型容器单元: Generics.Collections, 同时还有一个 Generics.Defaults 单元做支持. Generics.Collections 包含 ...

随机推荐

  1. 记录一次关于使用leaflet draw 插件叠加图层删除绘制层无法删除的问题

    问题描述 业务逻辑是这样的:再地图上已经绘制了一个多边形区域,然后需要再绘制的区域下再绘制下级区域,使用插件可以正常绘制并保存绘制数据,然后再回显编辑的时候,此时地图展示了上级多边形区域(该区域未追加 ...

  2. [Qt 基础-01] QPushButton

    QPushButton 简介 QPushButton是一个很常用的一个按钮控件,主要用于创建一个可按压的按键.它显示了一 个文本和一个图标.另外,你也可以在创建时,指定一个快捷键. 基本用法 1. 创 ...

  3. WPS EXCEL 根据录入的详细地址自动提取用户的籍贯信息

    =TRIM(IFERROR(LEFT(J18,FIND("省",J18)+LEN("省")-1),"") & " &quo ...

  4. 在Linux中查看分区表的4种方法

    作为Linux管理员,我们需要一次又一次地查看硬盘的分区表.这有助于我们通过为进一步分区腾出空间来重新组织旧驱动器,并在必要时为新驱动器创建空间.您可以在硬盘上创建不超过四个主分区,但可以在多个逻辑分 ...

  5. JavaScript将时间戳转化为时间

    const timestampToTime= (timestamp) => { const date = new Date(timestamp * 1000); const year = dat ...

  6. Electron 客户端开机自启动

    app.setLoginItemSettings 与 auto-launch 对比分析 一.稳定性对比 1. app.setLoginItemSettings 优点:作为Electron官方API,有 ...

  7. 【数据结构与算法】不同路径 III:使用哈密尔顿路径算法实现

    [数据结构与算法]不同路径 III:使用哈密尔顿路径算法实现 Java 不同路径 III https://leetcode-cn.com/problems/unique-paths-iii/ 解题思路 ...

  8. leetcode每日一题:酿造药水需要的最少总时间

    引言 ​ 今天的每日一题原题是2255. 统计是给定字符串前缀的字符串数目,直接模拟,逐个匹配words中的字符串是否是s的前缀即可.更换成前几天遇到的更有意思的一题来写这个每日一题. 题目 给你两个 ...

  9. [SDR] 蓝牙专项教程 —— 从 0 到 1 教小白基于 SDR 编写蓝牙协议栈

    目录 前言 一.开题之作 二.动态发送 BLE 广播包 三.基于 PlutoSDR 实现 BLE 广播包的收发一体能力 四.基于 PlutoSDR 的 BLE 广播包的收发实现接入涂鸦智能 APP 教 ...

  10. 抽离BlazorWebview中的.Net与Javascript的互操作库

    做这个的目的是想使用 Blazor 中的 Javascript 与 C#中的互操作,但是又不需要加载 Blazor 整个类库,另外 BlazorWebView 组件没有支持直接通过 Http 协议加载 ...