1. 程式人生 > >【TsinsenA1309】黑白染色題解

【TsinsenA1309】黑白染色題解

題面

試題來源

  2012中國國家集訓隊命題答辯

問題描述

  你有一個n*m的矩形,一開始所有格子都是白色,然後給出一個目標狀態的矩形,有的地方是白色,有的地方是黑色,你每次可以選擇一個連通塊(四連通塊,且不要求顏色一樣)進行染色操作(染成白色或者黑色)。問最少操作次數。
輸入格式
  第一行兩個數n,m表示矩形大小。
  接下來n行描述目標狀態,每行m個字元,’W’表示白色,’B’表示黑色。

輸出格式

  一行一個整數表示運算元。

樣例輸入

3 3
WBW
BWB
WBW

樣例輸出

2

資料規模和約定

  100%的資料n<=50,m<=50
  15%的資料n*m<=15
  另外15%的資料m=1

題解

分析

設相鄰的點互相通達,異色點距離為1,同色點距離為0
首先應知道,異色兩點距離為奇數,同色兩點距離為偶數
(請自行證明)
那麼設某個點到每個黑點的最短距離中的最遠距離為d
我們有一種最優染色方案(請自行證明最優性)
Step 1:將距離為d以內的點染為黑色
Step 2:將距離為d-1以內的點染為白色
Step 3:將距離為d-2以內的點染為黑色
·
·
·
Step d:將距離為1以內的點染為相應顏色
Step d+1:將距離為0的點(即自己所在區域)染為相應顏色
所以我們只要找到最小的d
輸出dmin+1即可

程式碼

#include <cstdio>
#include <iostream> #include <cstring> using namespace std; const int vec[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int ans,all,tot[2],n,m,i,j,k,dl[2][2501][2],maxn,o; int map[52][52],dis[52][52]; char s[52]; void dfs(int x,int y) { if (map[x][y]) maxn=max(maxn,dis[x][y]); for (int i=0;i<4;i++)
{ int X=x+vec[i][0],Y=y+vec[i][1]; if (1<=X && X<=n && 1<=Y && Y<=m) if (map[X][Y]^map[x][y]) if (dis[x][y]+1<dis[X][Y]) dis[X][Y]=dis[x][y]+1,dl[1-o][++tot[1-o]][0]=X,dl[1-o][tot[1-o]][1]=Y; else; else if (dis[x][y]<dis[X][Y]) dis[X][Y]=dis[x][y],dfs(X,Y); } } int check(int x,int y) { memset(dis,63,sizeof(dis)); maxn=0; tot[o]=1; dl[o][1][0]=x,dl[o][1][1]=y; dis[x][y]=0; while (tot[o]) { tot[1-o]=0; for (int i=1;i<=tot[o];i++) dfs(dl[o][i][0],dl[o][i][1]); o=1-o; } return maxn; } int main() { cin >> n >> m; for (i=1;i<=n;i++) { scanf("%s",s+1); for (j=1;j<=m;j++) if (s[j]=='W') all++; else map[i][j]=1; } if (all==n*m) { cout << 0; return 0; } ans=1<<30; for (i=1;i<=n;i++) for (j=1;j<=m;j++) ans=min(ans,check(i,j)); cout << ans+1; return 0; }

聽你說這是道圖論題???

相關推薦

TsinsenA1309黑白染色題解

題面 試題來源   2012中國國家集訓隊命題答辯 問題描述   你有一個n*m的矩形,一開始所有格子都是白色,然後給出一個目標狀態的矩形,有的地方是白色,有的地方是黑色,你每次可以選擇一個連通塊(四連通塊,且不要求顏色一樣)進行染色操作(染成白

Tsinsen A1039bzoj2638黑白染色 (BFS樹)

efi span clu mat 黑白 cin pan ref clas Descroption 原題鏈接 你有一個\(n*m\)的矩形,一開始所有格子都是白色,然後給出一個目標狀態的矩形,有的地方是白色,有的地方是黑色,你每次可以選擇一個連通塊(四連通塊,且不要求顏色一樣

bzoj 2303Apio2011方格染色

spa 有關 ... family target blog 思路 getchar() std 題目: http://www.lydsy.com/JudgeOnline/problem.php?id=2303 題解:   很神奇的思路,膜一發大佬http://www.cnbl

BZOJ3319黑白樹 並查集

維護 2個 bzoj3 printf highlight 集合 else cst find 【BZOJ3319】黑白樹 Description 給定一棵樹,邊的顏色為黑或白,初始時全部為白色。維護兩個操作:1.查詢u到根路徑上的第一條黑色邊的標號。2.將u到v

LeetCodeMerge Intervals 題解 利用Comparator進行排序

public 大於 def 沒有 答案 target sta 集合 它的 題目鏈接Merge Intervals /** * Definition for

codevs1191數軸染色 並查集

題目描述 Description 在一條數軸上有N個點,分別是1~N。一開始所有的點都被染成黑色。接著 我們進行M次操作,第i次操作將[Li,Ri]這些點染成白色。請輸出每個操作執行後 剩餘黑色點的個數。 輸入描述 Input Description

筆記區間染色問題

染色問題題意概要 給定一個長度為n的數字序列,有m次對[Li,Ri]的塗色(或其他修改),求最後的序列 其實這種題最突出的特徵是覆蓋,即後面的操作會覆蓋前面的操作,所以若一段區間被修改多次,取最後一次修改即可; 一:線段樹做法 其實這種題一看,用線

洛谷P1172安全逃離題解

get 測評 upload 也有 加粗 end 北方 幫助 情況 題目 題目描述 農夫john最近在研究如果發生重大事故,如何讓農場裏的奶牛逃離問題。他想要確信在緊急情況下,所有的奶牛都有一個安全逃離方案。因為在緊急情況下,奶牛們都會失去觀察和判斷能力,所以最近john一直

CF1428DBouncing Boomerangs 題解

[原題連結](https://codeforces.ml/contest/1428/problem/D) # 題意簡介 ~~毒瘤大模擬~~ 給你一張n*n的圖,在圖上擺有一些物體。從每一列的底端往上扔回旋鏢,每鏢中一個東西,迴旋鏢就會向右轉九十度。**現在我們知道從每列i底端往上鏢時撞上的物體個數ai,

題解JSOI2015染色問題

  好像這個容斥還是明顯的。一共有三個要求,可以用組合數先滿足一個,再用容斥解決剩下的兩個維。(反正這題資料範圍這麼小,隨便亂搞都可以)。預處理出 \(S[k][i]\) 表示使用 \(k\) 種顏色,至少有 \(i\) 列沒有染色的方案數,容斥可得使用 \(k\) 種顏色染色使得每行每列均被染色的方案數。然

題解HAOI2018染色

  好坑啊不開心……   其實這題的想法還是比較簡單粗暴的。題目明示恰好xxx,顯然排除斜率二分這個玩意兒,那麼不就只剩下容斥了嘛……   令 \(A_{x}\) 為恰好出現了 \(S\) 次的至少有 \(x\) 種的方案數, \({B_{x}}\) 為恰好出現了\(S\) 次的顏色恰好 \(x\) 種的

題解黑白奶牛

必須 space code clas john std urn spa 黑白 題目描述 有N只奶牛從左往右排成一行,編號是1至N。這N只奶牛當中,有一些奶牛是黑色的,其余的是白色的。 color[i]表示第i只奶牛的顏色,如果color[

CQOI2015多項式題解 (NKOJ3252)

高精度 put sizeof multi brush 亂搞 感謝 https bits 再次感謝Wikipedia提供公式支撐。 題面:Here 這道題其實很水,坑點在高精度。 給定 $F(x)=\sum^n_{k=0}a_kx^k=\sum^n_{k=0}b_k(x

zoj 1610 Count the Colors 區間覆蓋 求染色

ble article 之前 n) 讓我 family define first main Count the Colors Time Limit: 2 Seconds Memory Limit: 65536 KB Painting so

codeforces比賽題解#849 CF Round #431 (Div.2)

font pen 我們 sca oot can 結束 memset [0 cf的比賽越來越有難度了……至少我做起來是這樣。 先看看題目吧:點我。 這次比賽是北京時間21:35開始的,算是比較良心。 【A】奇數與結束 "奇數從哪裏開始,又在哪裏結束?夢想從何處起航,它們又是否

洛谷 P3374 模板樹狀數組 1 題解

數字 pri getchar 說明 using 完全 ace getc ret 此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。 題目鏈接:https://www.luogu.org/problem/show?pid=3374 題目描述 如題,

codeforces比賽題解#854 CF Round #433 (Div.2)

max code turn font tdi 想要 scanf printf clu cf一如既往挺喪 看喪題點我! 【A】分數 Petya是數學迷,特別是有關於分數的數學。最近他學了所謂一個分數被叫做“真分數”當且僅當其分子小於分母,而一個分數被叫做“最簡分數”當且僅當其

BZOJ4033[HAOI2015]樹上染色 樹形DP

復雜度 put inline getc 距離 turn bsp 樹形 light 【BZOJ4033】[HAOI2015]樹上染色 Description 有一棵點數為N的樹,樹邊有邊權。給你一個在0~N之內的正整數K,你要在這棵樹中選擇K個點,將其染成黑色,並將其

codeforces比賽題解#868 CF Round #438 (Div.1+Div.2)

這一 一行 mes 無限 解鎖 col 道路 ces 然而 這次是Div.1+Div.2,所以有7題。 因為時間較早,而且正好趕上訓練,所以機房開黑做。 然而我們都只做了3題。:(。 鏈接。 【A】聲控解鎖 題意: Arkady的寵物狗Mu-mu有一只手機。它需要朝這個手機

codeforces比賽題解#869 CF Round #439 (Div.2)

sister 十進制 長度 http include 越界 print const bool 良心賽,雖然我遲了半小時233333。 比賽鏈接:#869。 呃,CF的比賽都是有背景的……上次是《哈利波特》,這次是《物語》…… 【A】巧妙的替換 題意: Karen發現了石頭剪