[TCO2013]Block3Checkers
题意:一个网格上有一些障碍和$3$个在网格边界上的棋子,你要添加一些障碍使得没有两个棋子四连通,问最少添加多少个障碍
官方题解——一张图教你做人...
三个棋子将网格边界分成三段,添加障碍后网格中一定存在一个点使得它可以到这三段(只走障碍的路径,八连通)
所以找出这三段后分别以它们为起点跑最短路即可,经过障碍权值为$0$,经过空地权值为$1$
#include<stdio.h> #include<queue> #include<string.h> #include<vector> #include<string> using namespace std; int h[410],nex[7010],to[7010],v[7010],M; void add(int a,int b,int c){ M++; to[M]=b; v[M]=c; nex[M]=h[a]; h[a]=M; } int dis[410]; struct pr{ int x,d; pr(int u=0){x=u;d=dis[u];} }t; bool operator<(pr a,pr b){return a.d>b.d;} priority_queue<pr>q; void dijk(int x){ int i; memset(dis,63,sizeof(dis)); dis[x]=0; q.push(x); while(!q.empty()){ t=q.top(); q.pop(); x=t.x; if(t.d!=dis[x])continue; for(i=h[x];i;i=nex[i]){ if(dis[x]+v[i]<dis[to[i]]){ dis[to[i]]=dis[x]+v[i]; q.push(to[i]); } } } } const int g4[4][2]={{0,1},{0,-1},{1,0},{-1,0}},g8[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; int d[3][410],n,m; vector<string>mp; bool ok(int x,int y){ return 0<=x&&x<n&&0<=y&&y<m; } bool edge(int x,int y){ return ok(x,y)&&(x==0||x==n-1||y==0||y==m-1); } void dfs(int fx,int fy,int x,int y,int s){ int i,tx,ty; if(mp[x][y]=='A')return; add(s,x*m+y+1,0); add(x*m+y+1,s,mp[x][y]=='.'); for(i=0;i<4;i++){ tx=x+g4[i][0]; ty=y+g4[i][1]; if((tx!=fx||ty!=fy)&&edge(tx,ty))dfs(x,y,tx,ty,s); } } class Block3Checkers{ public: int blockThem(vector<string>mp){ int i,j,k,x,y,f,s[3],ans; ::mp=mp; n=mp.size(); m=mp[0].length(); s[0]=n*m+1; s[1]=n*m+2; s[2]=n*m+3; f=0; for(i=0;i<m;i++){ if(mp[0][i]=='A'){ if((i&&mp[0][i-1]=='A')||(i<m-1&&mp[0][i+1]=='A')||mp[1][i]=='A')return 100; if(i==0) dfs(0,0,1,0,s[f]); else dfs(0,i,0,i-1,s[f]); f++; } if(mp[n-1][i]=='A'){ if((i&&mp[n-1][i-1]=='A')||(i<m-1&&mp[n-1][i+1]=='A')||mp[n-2][i]=='A')return 100; if(i==m-1) dfs(n-1,m-1,n-2,m-1,s[f]); else dfs(n-1,i,n-1,i+1,s[f]); f++; } } for(i=1;i<n-1;i++){ if(mp[i][0]=='A'){ if(mp[i-1][0]=='A'||mp[i+1][0]=='A')return 100; dfs(i,0,i+1,0,s[f]); f++; } if(mp[i][m-1]=='A'){ if(mp[i-1][m-1]=='A'||mp[i+1][m-1]=='A')return 100; dfs(i,m-1,i-1,m-1,s[f]); f++; } } for(i=0;i<n;i++){ for(j=0;j<m;j++){ if(mp[i][j]!='A'){ for(k=0;k<8;k++){ x=i+g8[k][0]; y=j+g8[k][1]; if(ok(x,y)&&mp[x][y]!='A')add(i*m+j+1,x*m+y+1,mp[i][j]=='.'); } } } } for(i=0;i<3;i++){ dijk(s[i]); memcpy(d[i],dis,sizeof(dis)); } ans=n*m; for(i=0;i<n;i++){ for(j=0;j<m;j++){ if(mp[i][j]!='A'){ x=i*m+j+1; ans=min(ans,d[0][x]+d[1][x]+d[2][x]+(mp[i][j]=='.')); } } } return ans; } }; /* int main(){ vector<string>vt; char s[30]; Block3Checkers cl; while(~scanf("%s",s))vt.push_back(s); printf("%d",cl.blockThem(vt)); } */
[TCO2013]Block3Checkers的更多相关文章
- [TCO2013]TrickyInequality
$\newcommand{stirf}[2]{{{#1}\brack{#2}}}$$\newcommand{stirs}[2]{{{#1}\brace{#2}}}$题意:$\sum\limits_{i ...
- [TCO2013]LitPanels
题意:一个$n\times m$的无色网格,你可以在其中选择两个$x\times y$的子矩形并在其中将其中任意的格子涂上颜色,问最终能得到多少种不同的网格 做这题会用到一个概念叫包围盒(boundi ...
- [TCO2013]DirectionBoard
题意:给一个网格,每个格子有一个方向表示在这个格子上要往哪个方向走,你可以改变某些格子的方向,问最少多少次操作使得从任意格子出发都能回到这个格子 woc这都不会我还是回家种田去吧... 题目的要求是改 ...
随机推荐
- 【CF558E】 A Simple Task (权值线段树)
题目链接 用权值线段树维护每个字母在\([l,r]\)出现的次数,每次修改把每个字母在区间的出现次数记下来,然后清空这段区间,再按顺序插进去就好了. 时间复杂度\(O(n\log n*26)\) (好 ...
- 2017ACM暑期多校联合训练 - Team 1 1002 HDU 6034 Balala Power! (字符串处理)
题目链接 Problem Description Talented Mr.Tang has n strings consisting of only lower case characters. He ...
- js跨域上传文件 iframe
封装好的jq插件 (function () { var iframe = '<iframe name="jqUploadIframe" style="display ...
- Grunt构建工具
Grunt是javascript的构建工具,对于需要反复重复的任务,例如压缩(minification).编译.单元测试.linting等,自动化工具可以简化工作.Grunt生态系统非常庞大.你可以利 ...
- linux中断系统那些事之----中断处理过程【转】
转自:http://blog.csdn.net/xiaojsj111/article/details/14129661 以外部中断irq为例来说明,当外部硬件产生中断时,linux的处理过程.首先先说 ...
- 项目评审ppt的纲要
1.prd不能模糊,产品的问题全部明确 2.收益在哪里 3.设计体现业务4.怎样保证数据的前后协作5.异常如何处理6.技术解决的痛点7.对外部依赖8.性能指标预期(响应时间)9.
- 【bzoj4868】期末考试
我还第一次见到省选考三分……? #include<bits/stdc++.h> #define N 200005 using namespace std; typedef long lon ...
- Cause: java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.ibatis.mapping.MappedStatement
我用的是pagehelper 4.2.0,利用其进行表单的分页处理并进行展示,在第一次执行的时候能够看到分页后的结果,刷新一下第二次就显示不出来,控制台出现: Cause: java.lang.Cla ...
- 理解rest架构
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...
- html5重力感应事件之DeviceMotionEvent
前言 今天主要介绍一下html5重力感应事件之DeviceMotionEvent,之前我的一篇文章http://www.haorooms.com/post/jquery_jGestures, 介绍了第 ...