[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这都不会我还是回家种田去吧... 题目的要求是改 ...
随机推荐
- CSS(Cascading Style Shee)
1.CSS是Cascading Style Sheet这个几个英文单词的缩写,翻译成中文是“层叠样式表”的意思 CSS能让网页制作者有效的定制.改善网页的效果. CSS是对HTML的补充,网页设计师曾 ...
- 移动端 H5 页面注意事项
1. 单个页面内容不能过多 设计常用尺寸:750 x 1334 / 640 x 1134,包含了手机顶部信号栏的高度. 移动端H5活动页面常常需要能够分享到各种社交App中,常用的有 微信.QQ 等. ...
- 制作Solaris系统的USB启动盘
制作方法: 1. wget http://192.168.2.5/surefiler-installer/2011-12-09/devel-2011.12.9.tgz 2. cd /root tar ...
- 使用Redirector插件解决googleapis公共库加载的问题【转】
转自:http://www.cnblogs.com/kari/p/5860371.html 最近访问一些面向国外的网站总是会出现ajax.googleaips.com无法加载的情况.以下为加载stac ...
- 3.Python3标准库--数据结构
(一)enum:枚举类型 import enum ''' enum模块定义了一个提供迭代和比较功能的枚举类型.可以用这个为值创建明确定义的符号,而不是使用字面量整数或字符串 ''' 1.创建枚举 im ...
- FineReport——笔记
1填报分页:需要在填报预览下的链接后添加:&__cutpage__=v:
- P2327
code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; backgr ...
- 15:django 缓存架构
动态网站的一个基本权衡就是他们是动态的,每次一个用户请求一个页面,web服务器进行各种各样的计算-从数据库查询到模板渲染到业务逻辑-从而生成站点访问者看到的页面.从处理开销的角度来看,相比标准的从文件 ...
- LeetCode解题报告—— 4Sum & Remove Nth Node From End of List & Generate Parentheses
1. 4Sum Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + ...
- hdu 4632(区间dp)
Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/ ...