*[topcoder]HexagonalBoard
http://community.topcoder.com/stat?c=problem_statement&pm=12784
真心觉得tc的div1 250不少好题,对我来说比较适合。这道题一开始拿到是个棋盘,觉得像是DP,然后觉得有些不同,因为棋盘不是满的,二来这可能是个判定问题,就是2种颜色够不够,3中颜色够不够。然后想到DFS/BFS之类。再后来想到贪心,就是按顺序染色每个点,都用可以的最小颜色去染,觉得可行。写代码小错不断,最终pass。
#include <vector>
#include <string>
using namespace std; class HexagonalBoard {
public:
int minColors(vector <string> board);
private:
bool hitTest(vector <string> &board, int i, int j);
}; bool HexagonalBoard::hitTest(vector <string> &board, int i, int j) {
int m = board.size();
if (i < 0 || j < 0 || i >= m || j >= m) return false;
if (board[i][j] != 'X') return false;
return true;
} int HexagonalBoard::minColors(vector <string> board) {
int m = board.size();
vector<vector<int> > color(m);
for (int i = 0; i < m; i++) {
color[i].resize(m, 0);
}
int count = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
if (!hitTest(board, i, j))
continue;
vector<int> color_map(4, 0);
if (hitTest(board, i-1, j)) color_map[color[i-1][j]] = 1;
if (hitTest(board, i-1, j+1)) color_map[color[i-1][j+1]] = 1;
if (hitTest(board, i, j-1)) color_map[color[i][j-1]] = 1;
for (int k = 0; k < 4; k++) {
if (color_map[k] == 0) {
color[i][j] = k;
count = max(count, k+1);
break;
}
}
}
}
return count;
};
标程首先用理论证明最多3种颜色,因为0种和1种颜色都是显而易见的,那么就看是否可以两种颜色。这个判定其实就是二分图的判定,判断二分图方法:用染色法,把图中的点染成黑色和白色。首先取一个点染成白色,然后将其相邻的点染成黑色,如果发现有相邻且同色的点,那么就退出,可知这个图并非二分图(一次bfs,O(n))。
*[topcoder]HexagonalBoard的更多相关文章
- TopCoder kawigiEdit插件配置
kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
- TopCoder比赛总结表
TopCoder 250 500 ...
- Topcoder几例C++字符串应用
本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...
- TopCoder
在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...
- TopCoder SRM 596 DIV 1 250
body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...
- 求拓扑排序的数量,例题 topcoder srm 654 div2 500
周赛时遇到的一道比较有意思的题目: Problem Statement There are N rooms in Maki's new house. The rooms are number ...
- TopCoder SRM 590
第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement Fox Ciel is going to play Gomoku with her friend ...
- Topcoder Arena插件配置和训练指南
一. Arena插件配置 1. 下载Arena 指针:http://community.topcoder.com/tc?module=MyHome 左边Competitions->Algorit ...
随机推荐
- 在ef下使用lambda实现left join
db.Categories .GroupJoin( db.Products, Category => Category.CategoryId, Product => Product.Cat ...
- C#学习笔记1:正则表达式和数据库连接
1.using System.Text.RegularExpressions; 只有导入该命名空间,才能引入Regex对象,IsMatch是Regex中的一个方法,作用是来判断(输入)内容是否满足正则 ...
- 整理:sql语句优化之SQL Server
. 增加服务器CPU个数;但是必须明白并行处理串行处理更需要资源例如内存.使用并行还是串行程是MsSQL自动评估选择的.单个任务分解成多个任务,就可 以在处理器上运行.例如耽搁查询的排序.连接.扫描和 ...
- SQL Server调优系列进阶篇 - 深入剖析统计信息
前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQ ...
- VS2010 VS2012 如何连接Oracle 11g数据库
oracle是开发者常用的数据库,在做.NET开发是,由于Vs自带的驱动只能连接oracle 10g及以下版本,那么如何连接oracle 11g呢? 工具/原料 事先安装VS2010或者VS201 ...
- OC5_NSMutableString操作
// // main.m // OC5_NSMutableString操作 // // Created by zhangxueming on 15/6/10. // Copyright (c) 201 ...
- 转:如何取得Spring管理的bean
原文链接:http://blog.csdn.net/a9529lty/article/details/42145545 1.servlet方式加载时,[web.xml] <servlet> ...
- 写入.csv文件
#include "stdafx.h" #include "WriteCsv.h" CString m_strData;//写入记录的一条数据 CString ...
- poj代码搬家啦啦啦
我的poj代码搬家啦,大家想看可以到 blog.csdn.net/michaelysm 来看.欢迎哦
- 第一个 MIC shared_memory 程序
设置Intel编译器的运行环境 在terminal中执行编译器的环境脚本 compilervars.sh: source <install-dir>/bin/compilervars.sh ...