9.18考试 第三题chess题解



在讲这道题之前我们先明确一个丝薄出题人根本没有半点提示却坑死了无数人的注意点:
走敌人和不走敌人直接到时两种走法,但只走一个敌人和走一大坨敌人到同一个点只算一种方案(当然,前提是步骤一致)。
当时看完所有题后打算第一个打这道题,当时第一反应以为只是一个普普通通的宽搜,然后就发现我需要记录一下他走过那些敌人,然后就开始懵逼了,dfs能记录但太慢,bfs较快但无法记录,然后我只能在bfs中传递结构体,里面包含一个vector然后就全E了……
其实当时自己也是犯浑,过于局限于传统的棋盘搜索题了,对于敌人我们可以通过缩边,将敌人两侧的空格连在一起,然后就不必去担心卡死在里面了。不过我的方法相当麻烦,首先先对大棋盘建边,然后挨个tarjan,缩可以相互到达的敌人,然后又得重新建边,然后又需要在新边的基础上去缩边,总共搞了3次,自己都烦了,只能说挺练代码能力的……真的挺练的……
当然,我们完全可以dfs一下所有的敌人然后对于所有他们能连到的点之间相互建边,结果本博主太懒了,然后打了一个长了不知道几百倍的代码……
然后就是比较简单的spfa了。
不过对于第二问的答案,既然人家说了是long long 级别的,就一定有他的道理(虽然刚刚经过本博主踩雷发现改为int完全没问题,丝薄出题人……),所以由于棋盘有一个特殊性质:距离短的一定搜的早,所以我们只用记录一下到该点的方案数,更新距离是直接转移就好了。
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define N 53
using namespace std;
int n,m,c[N][N],zz1,zz2,zz5,zz,b[N*N],d[N*N],a[N*N];
][];
int bh[N][N];
struct ro{
int to,l;
int next;
}road[N*N*],road2[N*N*],road3[N*N*];
void build2(int x,int y,int z)
{
zz2++;
road2[zz2].to=y;
road2[zz2].next=b[x];
road2[zz2].l=z;
b[x]=zz2;
}
void build3(int x,int y,int z)
{
zz5++;
road3[zz5].to=y;
road3[zz5].l=z;
road3[zz5].next=d[x];
d[x]=zz5;
}
void build(int x,int y)
{
zz++;
road[zz].to=y;
road[zz].next=a[x];
a[x]=zz;
road[zz].l=;
}
bool check(int x,int y)
{
||x>n);
||y>m);
);
;
}
bool rz[N*N],rz2[N*N],lt[N*N][N*N],lt2[N*N][N*N],rd[N*N];
],top,dfn[N*N],low[N*N],zz3,belong[N*N],zz4,c2[N*N];
void tar(int x)
{
zz3++;
low[x]=dfn[x]=zz3;
rz[x]=rz2[x]=;
top++;
st[top]=x;
;i=road2[i].next)
{
int y=road2[i].to;
||c2[x]!=)continue;
if(!rz2[y])
{
tar(y);
low[x]=min(low[x],low[y]);
}
else if(rz[y])
low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x])
{
int v;
zz4++;
do{
v=st[top];
belong[v]=zz4;
top--;
rz[v]=;
}while(dfn[v]!=low[v]);
}
}
int dis[N*N],sx,sy,tx,ty,js[N*N];
void spfa()
{
memset(dis,0xf,sizeof(dis));
rd[belong[bh[sx][sy]]]=;
dis[belong[bh[sx][sy]]]=;
queue<int> q1;
q1.push(belong[bh[sx][sy]]);
js[belong[bh[sx][sy]]]=;
while(!q1.empty())
{
int x=q1.front();q1.pop();
rd[x]=;
if(x==belong[bh[tx][ty]])continue;
;i=road[i].next)
{
int y=road[i].to;
if(dis[y]>dis[x]+road[i].l)
{
dis[y]=dis[x]+road[i].l;
js[y]=;
js[y]+=js[x];
if(!rd[y])
{
q1.push(y);
rd[y]=;
}
}
else if(dis[y]==dis[x]+road[i].l) js[y]+=js[x];
}
}
}
int main()
{
scanf("%d%d",&n,&m);
;i<=n;i++)
{
;j<=m;j++)
{
zz1++;
bh[i][j]=zz1;
scanf("%d",&c[i][j]);
c2[zz1]=c[i][j];
)
sx=i,sy=j;
)
tx=i,ty=j;
}
}
zy[][]=-,zy[][]=-;
zy[][]=,zy[][]=-;
zy[][]=,zy[][]=;
zy[][]=-,zy[][]=;
zy[][]=-,zy[][]=-;
zy[][]=,zy[][]=-;
zy[][]=-,zy[][]=;
zy[][]=,zy[][]=;
;i<=n;i++)
{
;j<=m;j++)
{
;k<=;k++)
{
)continue;
],ty=j+zy[k][];
if(!check(tx,ty))continue;
;
)cj=;
build2(bh[i][j],bh[tx][ty],cj);
}
}
}
;i<=n;i++)
{
;j<=m;j++)
{
)continue;
if(!rz2[bh[i][j]])
tar(bh[i][j]);
}
}
;i<=n;i++)
{
;j<=m;j++)
{
)continue;
int t=bh[i][j];
;k=road2[k].next)
{
int y=belong[road2[k].to];
if(y!=belong[t]&&!lt[belong[t]][y])
{
lt[belong[t]][y]=;
build3(belong[t],y,road2[k].l);
}
}
}
}
memset(lt,,sizeof(lt));
;i<=zz4;i++)
{
;j=road3[j].next)
{
int y=road3[j].to;
)
{
;k=road3[k].next)
{
int z=road3[k].to;
if(z!=i&&!lt2[i][z])
build(i,z),lt2[i][z]=;
}
}
else if(!lt[i][y])
build(i,y),lt[i][y]=;
}
}
spfa();
])
printf("-1\n");
else
printf(,js[belong[bh[tx][ty]]]);
;
}
9.18考试 第三题chess题解的更多相关文章
- 9.5 考试 第三题 奇袭题解(codeforce 526f)
问题 C: 奇袭 时间限制: 1 Sec 内存限制: 256 MB 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯 ...
- bzoj 2752 9.20考试第三题 高速公路(road)题解
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1545 Solved: 593[Submit] ...
- Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)
这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...
- NOIP 2008提高组第三题题解by rLq
啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...
- Codeforces Round #524 (Div. 2)(前三题题解)
这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...
- PYC#1欢乐赛第三题题解
这里是比赛地址:http://tieba.baidu.com/p/2859693237,果然参赛神牛汇集. 第三题题目大意如下: 已知n条二次函数曲线Si(x)=aix^2+bix+ci(ai> ...
- 【LOJ6067】【2017 山东一轮集训 Day3】第三题 FFT
[LOJ6067][2017 山东一轮集训 Day3]第三题 FFT 题目大意 给你 \(n,b,c,d,e,a_0,a_1,\ldots,a_{n-1}\),定义 \[ \begin{align} ...
- [考试]NOIP2015模拟题2
// 此博文为迁移而来,写于2015年7月22日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w72i.html 1.总 ...
- Java-集合-第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList(); l
第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; ...
随机推荐
- 8086 CPU 寄存器简介(超详细,图文并茂)
http://www.cnblogs.com/BoyXiao/archive/2010/11/20/1882716.html
- spring-mvc+freemarker整合(sonne_game网站开发03)
今天的任务就是在spring+mybatis+springmvc的基础上,将freemarker整合进来. freemarker是什么? freemarker是一种模板引擎.它的目的是基于模板和数据, ...
- IP解析
import sys,re ip_1_stat = {} source_fp = open("ip_region","r") p = re.compile(&q ...
- 进程交互还可以使用QSharedMemory
官方例子: http://doc.qt.io/qt-5/qtcore-ipc-sharedmemory-example.html 查了一下,QSharedMemory没有自带任何信号.我的想法: 1. ...
- Delphi访问活动目录(使用COM,活动目录Active Directory是用于Windows Server的目录服务)
活动目录Active Directory是用于Windows Server的目录服务,它存储着网络上各种对象的有关信息,并使该信息易于管理员和用户查找及使用.Active Directory使用结构化 ...
- Qt paintEvent绘制窗体 注意Qt::WA_PaintOutsidePaintEvent 只是适用于X11,其他系统均无效
QPainter默认只能在paintEvent里面调用,但是: 在其他事件中绘制窗体,提示信息如下:QPainter::begin: Paint device returned engine == 0 ...
- C#每天进步一点--引用类型和值类型
在刚参加工作面试时,我们经常会遇到有关值类型和引用类型的问题,你回答的怎么样直接影响你在别人心目中的印象,你回答的不好说明你对C#没有深入的了解学习,今天我带大家回顾下C#中的引用类型和值类型. CL ...
- 基于Node.js的web聊天系统 - 真正意义上的web实时聊天系统
简单介绍一下这个实时web聊天系统的功能,首先进入系统的人填入名字和邮件地址后会获取到一个由系统创建的URL地址,你可以把这个地址发给另外一个人,另外一个人进入系统后就可以和你进行实时的聊天对话咯.主 ...
- Unity 通用透明物体漫反射Shader(双面渲染&多光源&光照衰减&法线贴图&凹凸透明度控制)
Shader "MyUnlit/AlphaBlendDiffuse" { Properties { _Color("Color Tint(贴图染色)",Colo ...
- ES6 新增声明变量的 var let const 的区别详解
var 如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域. let 1.let 声明的变量具有块作用域的特征 ...