时间限制: 1 Sec 内存限制: 128 MB
题目描述
Flow Free is a puzzle that is played on a 2D grid of cells, with some cells marked as endpoints of certain colors and the rest of cells being blank. To solve the puzzle, you have to connect each pair of colored endpoints with a path, following these rules:
there is a path connecting two points with the same color, and that path also has that color
all cells in the grid are used and each cell belongs to exactly one path (of the same color as the endpoints of the path)
The rules imply that different colored paths cannot intersect.
The path is defined as a connected series of segments where each segment connects two neighbouring cells. Two cells are neighbours if they share a side (so all segments are either horizontal or vertical). By these definitions and rules above, each colored cell will be an endpoint of exactly one segment and each blank cell will be an endpoint of exactly two segments.
In this problem we will consider only the 4×4 puzzle, with 3 or 4 pairs of colored endpoints given.
Your task is to determine if a given puzzle is solvable or not.
输入
The input consists of 4 lines, each line containing 4 characters. Each character is from the set {R, G,B, Y,W}whereW denotes the blank cells and the other characters denote endpoints with the specified color. You are guaranteed that there will be exactly 3 or 4 pairs of colored cells. If there are 3 colors in the grid, Y will be omitted.
输出
On a single line output either “solvable” or “not solvable” (without the quotes).
样例输入
RGBW
WWWW
RGBY
YWWW
样例输出
solvable

开始读错了题,没注意要连上所有的块。
暴力枚举每个W块的颜色,每种情况下从起点广搜终点,不用vis数组剪枝而采用记录路径(状压)可以保证搜到每种路径,搜到终点时判断是否走过了所有相同颜色的格子。
第二天仔细想想,还是写的太麻烦了,实际上直接深搜就好了…

#define IN_LB() freopen("F:\\in.txt","r",stdin)
#define IN_PC() freopen("C:\\Users\\hz\\Desktop\\in.txt","r",stdin)
#include <bits/stdc++.h> using namespace std;
const int dirx[] = {-1,0,1,0};
const int diry[] = {0,1,0,-1};
const char col[] ="RGBY";
char mapp[5][5]; struct node {
int x,y,route,step;
node() {}
node(int x,int y,int route,int step):x(x),y(y),route(route),step(step) {}
} cR[2],cG[2],cB[2],cY[2]; int cntR,cntG,cntB,cntY;
vector <int> v; int xytoInd(int x,int y){
return x*4+y;
} bool bfs(char color,node st,node ed,int cnum) {
queue<node> q;
q.push(st);
while(!q.empty()) {
int x = q.front().x,y=q.front().y,route = q.front().route,step = q.front().step;
q.pop();
if(x==ed.x&&y==ed.y&&cnum+1==step)return true;
for(int i=0; i<4; i++) {
int xx = x+dirx[i],yy=y+diry[i];
if(xx>=0&&xx<4&&yy>=0&&yy<4&&mapp[xx][yy]==color&&((route&(1<<xytoInd(xx,yy)))==0)) {
q.push(node(xx,yy,route|(1<<xytoInd(xx,yy)),step+1));
}
}
}
return false;
} int main() {
// IN_PC();
for(int i=0; i<4; i++) {
scanf("%s",mapp[i]);
}
for(int i=0; i<4; i++) {
for(int j=0; j<4; j++) {
if(mapp[i][j]=='W') {
v.push_back(i*4+j);
}
if(mapp[i][j]=='R') {
cR[cntR++] = node(i,j,1<<xytoInd(i,j),0);
}
if(mapp[i][j]=='G') {
cG[cntG++] = node(i,j,1<<xytoInd(i,j),0);
}
if(mapp[i][j]=='B') {
cB[cntB++] = node(i,j,1<<xytoInd(i,j),0);
}
if(mapp[i][j]=='Y') {
cY[cntY++] = node(i,j,1<<xytoInd(i,j),0);
}
}
}
int num = v.size();
int flag = 0;
if(num==8) {
int sumsta = pow(4,8);
for(int i=0; i<sumsta; i++) {
int c = i,cn[4]={0};
for(int j=0; j<8; j++) {
int x = v[j]/4,y = v[j]%4;
mapp[x][y] = col[c%4];
cn[c%4]++;
c/=4;
}
if(bfs('R',cR[0],cR[1],cn[0])
&&bfs('G',cG[0],cG[1],cn[1])
&&bfs('B',cB[0],cB[1],cn[2])
&&bfs('Y',cY[0],cY[1],cn[3])) {
flag = 1;
break;
}
}
} else if(num==10) {
int sumsta = pow(3,10);
for(int i=0; i<sumsta; i++) {
int c = i,cn[3]={0};
for(int j=0; j<10; j++) {
int x = v[j]/4,y = v[j]%4;
mapp[x][y] = col[c%3];
cn[c%3]++;
c/=3;
}
if(bfs('R',cR[0],cR[1],cn[0])
&&bfs('G',cG[0],cG[1],cn[1])
&&bfs('B',cB[0],cB[1],cn[2])) {
flag = 1;
break;
}
}
}
if(flag)printf("solvable\n");
else printf("not solvable\n");
return 0;
}

【暴力枚举&BFS】Flow Free @RMRC2017/upcexam5124的更多相关文章

  1. CodeForces 742B Arpa’s obvious problem and Mehrdad’s terrible solution (暴力枚举)

    题意:求定 n 个数,求有多少对数满足,ai^bi = x. 析:暴力枚举就行,n的复杂度. 代码如下: #pragma comment(linker, "/STACK:1024000000 ...

  2. 2014牡丹江网络赛ZOJPretty Poem(暴力枚举)

    /* 将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include<iostream> #include<cstri ...

  3. HNU 12886 Cracking the Safe(暴力枚举)

    题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12886&courseid=274 解题报告:输入4个数 ...

  4. 51nod 1116 K进制下的大数 (暴力枚举)

    题目链接 题意:中文题. 题解:暴力枚举. #include <iostream> #include <cstring> using namespace std; ; ; ch ...

  5. Codeforces Round #349 (Div. 1) B. World Tour 最短路+暴力枚举

    题目链接: http://www.codeforces.com/contest/666/problem/B 题意: 给你n个城市,m条单向边,求通过最短路径访问四个不同的点能获得的最大距离,答案输出一 ...

  6. bzoj 1028 暴力枚举判断

    昨天梦到这道题了,所以一定要A掉(其实梦到了3道,有两道记不清了) 暴力枚举等的是哪张牌,将是哪张牌,然后贪心的判断就行了. 对于一个状态判断是否为胡牌,1-n扫一遍,然后对于每个牌,先mod 3, ...

  7. POJ-3187 Backward Digit Sums (暴力枚举)

    http://poj.org/problem?id=3187 给定一个个数n和sum,让你求原始序列,如果有多个输出字典序最小的. 暴力枚举题,枚举生成的每一个全排列,符合即退出. dfs版: #in ...

  8. hihoCoder #1179 : 永恒游戏 (暴力枚举)

    题意: 给出一个有n个点的无向图,每个点上有石头数个,现在的游戏规则是,设置某个点A的度数为d,如果A点的石子数大于等于d,则可以从A点给每个邻接点发一个石子.如果游戏可以玩10万次以上,输出INF, ...

  9. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

随机推荐

  1. bzoj2908

    题解: 我的做法好像跟网上不太一样.. 首先分位讨论 我的做法是先观察出了一个性质 这个答案只跟最后一个0出现的位置有关(这个随便yy一下很容易出来因为运算有0则1) 然后问题就变成了 给出一棵树,支 ...

  2. nginx error.log 提示 [error] 887#887: *58 FastCGI sent in stderr: "PHP message: PHP Warning: mysql_connect(): Headers and client library minor version mismatch. Headers:50556 Library:50637

    0. 1.问题 1.1现象: nginx error.log 提示 [error] 887#887: *58 FastCGI sent in stderr: "PHP message: PH ...

  3. Codeforces 356D Bacterial Melee dp

    Bacterial Melee 我们发现所有合法串都是原序列的某个子序列(这个子序列相邻元素相等) 的扩展, 比如子序列为abc, 那么aabbbc, abbbcc 等都是合法串. 所以我们只需要dp ...

  4. php5.6安装redis各个版本地址集合

    igbinary扩展 http://windows.php.net/downloads/pecl/releases/igbinary/2.0.1/ redis扩展 http://windows.php ...

  5. Aladdin and the Flying Carpet(唯一分解定理)

    题目大意:给两个数a,b,求满足c*d==a且c>=b且d>=b的c,d二元组对数,(c,d)和(d,c)属于同一种情况: 题目分析:根据唯一分解定理,先将a唯一分解,则a的所有正约数的个 ...

  6. BOM 和 DOM

    目录 一.BOM 1.什么是BOM 2. 浏览器内容划分 归BOM管的: 归DOM管的: 3. BOM常见方法 二.DOM 1 什么是DOM 2. DOM常见方法 一.BOM 1.什么是BOM BOM ...

  7. Linux添加系统环境变量

    在Linux下使用源码安装软件的时候,通常只能在软件安装目录下使用该软件命令(使用yum命令安装的除外),这样太麻烦,我们希望全局使用,可以将软件安装路径添加到系统环境变量里. 添加环境变量有2种方法 ...

  8. tensorflow下基于DNN实现实时分辨人脸微表情

    参加学校的国创比赛的时候,我们小组的项目有一部分内容需要用到利用摄像头实现实时检测人脸的表情,因为最近都在看深度学习方面的相关知识,所以就自己动手实现了一下这个小Demo.参考网上的资料,发现大部分是 ...

  9. 从零搭建 ES 搜索服务(二)基础搜索

    一.前言 上篇介绍了 ES 的基本概念及环境搭建,本篇将结合实际需求介绍整个实现过程及核心代码. 二.安装 ES ik 分析器插件 2.1 ik 分析器简介 GitHub 地址:https://git ...

  10. AngularJS之拖拽排序(ngDraggable.js)

    ngDraggable.js是一款比较简单实用的angularJS拖拽插件,借助于封装好的一些自定义指令,能够快速的进行一些拖拽应用开发.首先先介绍一些基本的概念; ng-drop:是否允许放入拖拽元 ...