在讲这道题之前我们先明确一个丝薄出题人根本没有半点提示却坑死了无数人的注意点:

    走敌人和不走敌人直接到时两种走法,但只走一个敌人和走一大坨敌人到同一个点只算一种方案(当然,前提是步骤一致)。

  当时看完所有题后打算第一个打这道题,当时第一反应以为只是一个普普通通的宽搜,然后就发现我需要记录一下他走过那些敌人,然后就开始懵逼了,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题解的更多相关文章

  1. 9.5 考试 第三题 奇袭题解(codeforce 526f)

    问题 C: 奇袭 时间限制: 1 Sec  内存限制: 256 MB 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯 ...

  2. bzoj 2752 9.20考试第三题 高速公路(road)题解

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1545  Solved: 593[Submit] ...

  3. Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)

    这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...

  4. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  5. Codeforces Round #524 (Div. 2)(前三题题解)

    这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...

  6. PYC#1欢乐赛第三题题解

    这里是比赛地址:http://tieba.baidu.com/p/2859693237,果然参赛神牛汇集. 第三题题目大意如下: 已知n条二次函数曲线Si(x)=aix^2+bix+ci(ai> ...

  7. 【LOJ6067】【2017 山东一轮集训 Day3】第三题 FFT

    [LOJ6067][2017 山东一轮集训 Day3]第三题 FFT 题目大意 给你 \(n,b,c,d,e,a_0,a_1,\ldots,a_{n-1}\),定义 \[ \begin{align} ...

  8. [考试]NOIP2015模拟题2

    // 此博文为迁移而来,写于2015年7月22日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w72i.html 1.总 ...

  9. 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; ...

随机推荐

  1. wpf 换行符

    方法1: <TextBlock Text="第一行 第二行"/>文字中间加上: 就可以了.这个方法很有用,也可以用在ToolTip上:<ToolTip Width ...

  2. Win10《芒果TV》更新v3.8.0初夏版:全新视觉体验,即刻分享视频

    历时半年多昼夜,千呼万唤始出来,Win10版<芒果TV>全平台同步更新初夏版v3.8.0,统一视觉体验,完善分享投屏,进一步提升使用体验. Win10版<芒果TV>V3.8.0 ...

  3. C#匹配中文字符串的4种正则表达式分享

    本文介绍在C#中使用匹配中文的正则表达式,包括纯中文.有中文.中文开头.中文结尾等几个正则表达式示例.在正则表达式中,中文可以通过Unicode编码来确定正则表达式范围. 在C#中,匹配中文的正则表达 ...

  4. C#WeakReference弱引用

    原文:C#WeakReference弱引用 弱引用:在引用对象的同时,允许垃圾回收该对象. .NET中提供了WeakReference对象来实现这个功能. 对于那些创建便宜但耗费大量内存的对象,即希望 ...

  5. Android零基础入门第87节:Fragment添加、删除、替换

    前面一起学习了Fragment的创建和加载,以及其生命周期方法,那么接下来进一步来学习Fragment的具体使用,本期先来学习Fragment添加.删除.替换. 一.概述 在前面的学习中,特别是动态加 ...

  6. UWP开发-在UWP中使用sqlite

    原文:UWP开发-在UWP中使用sqlite sqlite是一种轻量级的数据库,对于一些资源紧张又需要数据库的开发非常好用. SQLite 是一个开源的无服务器嵌入式数据库. 这些年来,它已作为面向存 ...

  7. Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)

    一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32 ...

  8. =WM_VSCROLL(消息反射) 和 WM_VSCROLL(消息响应)的区别(控件拥有者自己不处这个理消息,而是反射给控件对象本身来处理这个消息)

    =WM_VSCROLL(消息反射) 和 WM_VSCROLL(消息响应)的区别 所谓消息反射就是控件拥有者自己不处这个理消息,而是反射给控件对象本身来处理这个消息 1.“=WM_VSCROLL”是消息 ...

  9. QT运行cmd指令(两种办法:QProcess.start然后waitForFinished,运行cmd /c命令)

    QProcess p(); p.start("route");//写入要运行的指令即可 p.waitForStarted(); p.waitForFinished(); qDebu ...

  10. 设置tablewidget自适应列宽和设置自动等宽

      在网上很容易知道自适应列宽,100%不留空显示,这里还是提下: /*设置表格是否充满,即行末不留空*/ ui->tableWidget->horizontalHeader()-> ...