Problem Statement

    

There is a H times W rectangle divided into unit cells. The rows of cells are numbered 0 to H-1 from top to bottom, and the columns are numbered 0 to W-1 from left to right. The corners of cells are called lattice points. By definition, there are (H+1)*(W+1) lattice points in our rectangle.

Each of the four edges of each cell is painted white. Additionally, in some cells exactly one of the two diagonals is painted white. In the remaining cells no diagonal is painted white yet. Later, you are going to paint exactly one of the diagonals white in each of these cells.

Once you are done painting the diagonals, your next goal will be to color each of the lattice points using one of three available colors: red, green, or blue. There is only one constraint: adjacent lattice points are not allowed to share the same color.

Two lattice points are called adjacent if they are connected by a white line segment. (In other words, consecutive corners of a cell are always adjacent, opposite corners of a cell are adjacent if and only if they are connected by a painted diagonal, and no other pairs of lattice points are adjacent.)

Obviously, you need to paint the missing diagonals in such a way that there will be a valid coloring of lattice points, if possible.

You are given a vector <string> cells with H elements, each consisting of W characters. If cells[i][j] is 'N', there is a diagonal line from the top left to the bottom right corner in the cell in row i, column j. If cells[i][j] is 'Z', there is a diagonal line from the top right to the bottom left corner in the cell in row i, column j. If cells[i][j] is '?', there is no diagonal yet in the cell in row i, column j.

If it is impossible to fill in the missing diagonals in such a way that there will be a valid coloring of all lattice points, return an empty vector <string>. Otherwise, return a vector <string> that represents the rectangle with all the missing diagonals filled in. I.e., the return value must be obtained from cells by replacing each '?' by either 'N' or 'Z'. The return value must represent a rectangle for which a valid coloring of its lattice points exists. If there are multiple possibilities, return the lexicographically smallest one.

Definition

    
Class: ThreeColorability
Method: lexSmallest
Parameters: vector <string>
Returns: vector <string>
Method signature: vector <string> lexSmallest(vector <string> cells)
(be sure your method is public)

Limits

    
Time limit (s): 2.000
Memory limit (MB): 64

Notes

- Given two different vector <string>s A and B with the same number of elements, find the smallest index i such that A[i] and B[i] differ. If A[i] < B[i] we say that A is lexicographically smaller than B and vice versa.

Constraints

- cells will contain between 1 and 50 elements, inclusive.
- Each element of cells will contain between 1 and 50 characters, inclusive.
- All elements of cells will contain the same number of characters.
- Each character of cells will be either 'N' or 'Z' or '?'.

Examples

0)  
    
{"Z"}
Returns: {"Z" }
The given rectangle and a possible coloring is as follows.

1)  
    
{"??", "?N"}
Returns: {"NN", "NN" }

2)  
    
{"ZZZ", "ZNZ"}
Returns: { }
 
3)  
    
{"N?N??NN","??ZN??Z","NN???Z?","ZZZ?Z??","Z???NN?","N?????N","ZZ?N?NN"}
Returns: { }
 
4)  
    
{"ZZZZ","ZZZZ","ZZZZ"}
Returns: {"ZZZZ", "ZZZZ", "ZZZZ" }
 

题意:给定一个网格图,为每个格子安排对角线(有些格子已经安排好),使得新图可以被用三种颜色染色(被一条边相连的两个点不能染同一种颜色)。两种对角线用'Z'与'N'表示。

题解:

画图找规律,可以发现,在相邻的四个格子中(即3*3的格点),'Z'的数量为偶数。

由此可以推得,在一个合法的图中,一行格子的对角线安排如果不与相邻的行完全相同,就与相邻的行完全相反。

即不管在哪一行,第i列与第j列格子对角线安排是否相同的关系都是一样的。

即我们可以用已知的每一行内的关系,通过并查集处理出第一行各格子的关系。

然后在满足原本安排方案的情况下,求出一种字典序最小的安排方案。

代码:

 int fa[],a[][],n,m;
int getf(int x)
{
if(fa[x]!=x)fa[x]=getf(fa[x]);
return fa[x];
}
int hb(int xx,int yy)
{
int x=getf(xx),y=getf(xx+m),z=getf(yy),w=getf(yy+m);
if((x==w)or(y==z))return ;
fa[x]=z; fa[y]=w; return ;
}
int qf(int xx,int yy)
{
int x=getf(xx),y=getf(xx+m),z=getf(yy),w=getf(yy+m);
if((x==z)or(y==w))return ;
fa[x]=w; fa[y]=z; return ;
}
int pd(char x)
{ if(x=='N')return ; if(x=='Z')return -; return ; }
class ThreeColorability
{
public:
vector <string> lexSmallest(vector <string> cells)
{
//$CARETPOSITION$
vector<string>ans;
n=cells.size(); m=cells[].size();
for(int i=;i<m;i++)fa[i]=i,fa[i+m]=i+m;
for(int i=;i<n;i++)
for(int j=;j<m-;j++)
if(cells[i][j]!='?')
{
for(int k=j+;k<m;k++)
if(cells[i][k]!='?')
{
int flag;
if(cells[i][j]==cells[i][k])flag=hb(j,k);else flag=qf(j,k);
if(flag==)return ans;
}
}
for(int j=;j<m;j++)
{
int t=pd(cells[][j]);
if(t!=)
{
int x=getf(j),y=getf(j+m);
for(int k=;k<m;k++)
{
if(getf(k)==x)a[][k]=t;else
if(getf(k)==y)a[][k]=-t;
}
}
}
for(int j=;j<m;j++)
if(a[][j]==)
{
int x=getf(j),y=getf(j+m);
for(int k=;k<m;k++)
{
if(getf(k)==x)a[][k]=;else
if(getf(k)==y)a[][k]=-;
}
}
for(int i=;i<n;i++)
{
int x=;
for(int j=;j<m;j++)if(pd(cells[i][j])!=)
{ if(pd(cells[i][j])==a[i-][j])x=;else x=-; break; }
if(x==){ if(a[i-][]==)x=;else x=-; }
for(int j=;j<m;j++)a[i][j]=a[i-][j]*x;
}
for(int i=;i<n;i++)
{
string s; s.clear();
for(int j=;j<m;j++)if(a[i][j]==)s=s+'N';else s=s+'Z';
ans.push_back(s);
}
return ans;
}
};

TopCoder[SRM587 DIV 1]:ThreeColorability(900)的更多相关文章

  1. TopCoder[SRM587 DIV 1]:TriangleXor(550)

    Problem Statement      You are given an int W. There is a rectangle in the XY-plane with corners at ...

  2. TopCoder SRM 559 Div 1 - Problem 900 CircusTents

    传送门:https://284914869.github.io/AEoj/559.html 题目简述: n个实心圆,两两没有交集,在第一个圆上找一个点,使得它到另外一个圆上某个点的最短距离的最小值尽量 ...

  3. TopCoder[SRM513 DIV 1]:Reflections(1000)

    Problem Statement      Manao is playing a new game called Reflections. The goal of the game is trans ...

  4. Topcoder SRM584 DIV 2 500

    #include <set> #include <iostream> #include <string> #include <vector> using ...

  5. Topcoder SRM583 DIV 2 250

    #include <string> #include <iostream> using namespace std; class SwappingDigits { public ...

  6. 【补解体报告】topcoder 634 DIV 2

    A:应该是道语文题,注意边界就好: B:开始考虑的太复杂,没能够完全提取题目的思维. 但还是A了!我愚蠢的做法:二分答案加暴力枚举, 枚举的时候是完全模拟的,比如每次取得时候都是从大到小的去取,最后统 ...

  7. Topcoder Srm627 DIV 2

    A,B:很水,注意边界,话说HACK都是这些原因. C: R[I][J]:表示反转I-J能改变冒泡排序的次数: DP方程:dp[i][k]=max(dp[j][k],dp[j][k-1]+dp[j][ ...

  8. Topcoder SRM548 Div 1

    1. KingdomAndTrees 给出n个数a[1..n],求一个数组b[1..n]满足b严格递增,且b[1]>=1. 定义代价为W = max{abs(a[i]-b[i])},求代价最小值 ...

  9. TopCoder SRM 701 Div2 Problem 900 ThueMorseGame(博弈+预处理)

    题意  Alice和Bob在玩一个游戏,Alice先手. 每次一个人可以从一堆式子中拿走任意数量(不超过m)的式子. 取走最后一颗式子的人胜利. 当一个取完某一步的时候剩下的石子数量的二进制表示中1的 ...

随机推荐

  1. Eclipse中发布Maven管理的Web项目时找不到类的问题根源和解决办法(转)

    转自:http://blog.csdn.net/lvguanming/article/details/37812579?locationNum=12 写在前面的话 现在是越来越太原讨厌Eclipse这 ...

  2. web.xml中配置——解决post乱码

    <!-- 解决post乱码 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> ...

  3. Java——类的成员之五:内部类

    3.6 类的成员之五:内部类 3.6.1 静态内部类 ①静态内部类可以等同看做静态变量. ②内部类重要的作用:可以访问外部类中私有的数据. ③静态内部类可以直接访问外部类的静态数据,无法直接访问成员. ...

  4. Qt第三方库QCustomPlot——QCustomPlot解读

    这个小部件类,对于QCustomPlot的所有方面都有所体现 下面阅读它的函数: 函数组织顺序为: 基本设置---添加图线---删除图线---添加额外Item---层次管理---坐标轴管理----导出 ...

  5. JVM内存分为哪几部分?各个部分的作用是什么?

    JVM内存区域分为五个部分,分别是堆,方法区,虚拟机栈,本地方法栈,程序计数器. 堆. 堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上,Java堆可使用-Xm ...

  6. shutil库文件的操作

    一.拷贝,移动,改名 import shutil old_file=r"C:\Users\ffm11\Desktop\AI.docx" new_file=r"C:\Use ...

  7. WebBug靶场基础篇 — 02

    本篇以第一人称记录这个关卡的第 1-5 关. 由于我记录的过程有点偏向于思考,所以截图截的多 = =!所以文章有点长... 下午一觉醒来,已经 4 点多了,然后开电脑,在虚拟机里,铺了铺靶场,但是毕竟 ...

  8. Hadoop-HDFS的伪分布式和完全分布式集群搭建

    Hadoop-HDFSHDFS伪分布式集群搭建步骤一.配置免密登录 ssh-keygen -t rsa1一句话回车到底 ssh-copy-id -i ~/.ssh/id_rsa.pub root@no ...

  9. c go数据类型对应关系

    DataType C cgo sizeof--------------------+--------------------+------------------------------------- ...

  10. 20、formAdd,javascript实现动态添加

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...