算法问题实战策略 BOARDCOVER
地址 https://algospot.com/judge/problem/read/BOARDCOVER


解法
DFS 最近似乎在简单DFS上花费太多时间了
首先扫描地图 统计可覆盖的元素个数 如果不是3的倍数 那肯定不能覆盖完全 返回0
然后进行DFS 尝试各种覆盖办法 一共12种(由于必须覆盖完所有元素 就规定从左上角开始覆盖,其实可以只有四种覆盖办法)

每次DFS结束则覆盖方法增加1种 尝试所有覆盖方式后 函数也返回
注意需要寻找每次下一个尝试的覆盖点 规定从左上角开始找起
代码
// 11111111111111.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include <iostream>
#include <vector> using namespace std; const int N = ; char gmap[N][N]; int loop;
int ans = ;
int n, m; struct board {
int x1, y1;
int x2, y2;
int x3, y3;
}; vector<struct board> fillBoad=
{
{,, -,, ,-},
{,, ,, ,-},
{,, -,, ,},
{,, ,, ,}, {,, ,, ,-},
{,, -,, -,-},
{,, ,, ,},
{,, -,, -,}, {,, ,, -,},
{,, ,, ,},
{,, ,-, ,-},
{,, ,-, --},
}; bool CheckXY(int x1, int y1, int x2, int y2, int x3, int y3)
{
if (x1 < || y1 < || x2 < || y2 < || x3 < || y3 < )
return false; if (x1 >= n || x2 >= n || x3 >= n || y1 >= m || y2 >= m || y3 >= m)
return false; if (gmap[x1][y1] == '#' || gmap[x2][y2] == '#' || gmap[x3][y3] == '#')
return false; return true;
} void DFS(int x, int y,int needfill)
{
if (needfill == ) {
ans++;
return;
} for (; x < n; x++) {
for ( y = ; y < m; y++) {
if (gmap[x][y] == '.')
goto FIND;
}
}
FIND: for (int i = ; i < ; i++) { int newx1 = x + fillBoad[i].x1;
int newy1 = y + fillBoad[i].y1;
int newx2 = x + fillBoad[i].x2;
int newy2 = y + fillBoad[i].y2;
int newx3 = x + fillBoad[i].x3;
int newy3 = y + fillBoad[i].y3; if (CheckXY(newx1, newy1, newx2, newy2, newx3,newy3)) {
gmap[newx1][newy1] = '#';
gmap[newx2][newy2] = '#';
gmap[newx3][newy3] = '#';
needfill -= ; int p = x; int q = y;
for (; p < n; p++) {
for ( q = ; q < m; q++) {
if (gmap[p][q] == '.')
goto FIND1;
}
} FIND1: DFS( p,q, needfill); needfill += ;
gmap[newx1][newy1] = '.';
gmap[newx2][newy2] = '.';
gmap[newx3][newy3] = '.'; }
} return;
} int main()
{
cin >> loop; while (loop--)
{
cin >> n >> m; memset(gmap,,N*N);
ans = ; int count = ;
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
cin >> gmap[i][j];
if (gmap[i][j] == '.')
count++;
}
} if (count % != ){
cout << << endl;
continue;
} DFS(,,count);
cout << ans << endl;
} return ;
}
ac

算法问题实战策略 BOARDCOVER的更多相关文章
- 算法问题实战策略 PICNIC
下面是另一道搜索题目的解答过程题目是<算法问题实战策略>中的一题oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/PICNIC ...
- 《算法问题实战策略》-chaper7-穷举法
关于这一章节<算法实战策略>有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作.相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者 ...
- 《算法问题实战策略》-chaper32-网络流
基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”. 流问题的基本概念: 首先给出一张图. 其实所谓 ...
- 《算法问题实战策略》-chaper13-数值分析
这一章节主要介绍我们在进行数值分析常用的二分.三分和一个近似求解区间积分的辛普森法. 首先介绍二分. 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解 ...
- 《算法问题实战策略》——chaper9——动态规划法技巧
Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1) 拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2) 棋盘中还剩 ...
- 《算法问题实战策略》-chaper8-动态规划法
Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...
- 《算法问题实战策略》-chaper21-树的实现和遍历
这一章节开始介绍一个数据结构中的一个基本概念——树. 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列.数组和链表等结构表征),还有一个重要的特性——层级结构 ...
- 算法问题实战策略 QUADTREE
地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...
- 算法问题实战策略 DICTIONARY
地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...
随机推荐
- config-server-bus动态更新配置
config-server用来搭建配置中心,而配置信息一般使用gitlab仓库来存储,这样在你的配置发生改变时,不需要从新打包,而如果使用native的试,则需要从新打一个config-server的 ...
- How to: Specify a Display Member (for a Lookup Editor, Detail Form Caption, etc.)如何:指定显示成员(用于查找编辑器、详细信息表单标题等)
Each business object used in an XAF application should have a default property. The default property ...
- ionic项目使用Google FCM插件和Google maps插件打包android报错冲突问题
这段时间在调FCM推送服务的插件 ,原本以为去年调通过,应该很容易,没想到还是出问题了.现将问题及解决方法整理如下,仅供参考: 先看打包报错截图: 详细报错信息:Please fix ...
- leaflet-webpack 入门开发系列五地图卷帘(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- AlertDialog创建对话框的测试
AlertDialog的功能是非常强大的,它可以创建各种对话框,它的结构分为:图标区.标题区.内容区.按钮区共四个区域.以这样的思路区创建AlertDialog是非常简单的. 创建AlertDialo ...
- source insight 3 常用设置
总结了一些source insight的一些常用设置,这些设置需求因人而异,自己用的顺手的才是最好的. 1.括号配对高亮“在前括号左侧,后括号左侧”双击鼠标左键,可以选定匹配括号和其中内容(<& ...
- 后端必备 Nginx 配置
后端必备 Nginx 配置 概要 防盗链 根据文件类型设置过期时间 静态资源访问 日志配置 日志字段说明 access_log 访问日志 error_log 日志 日志切割 反向代理 禁止指定user ...
- error: [debug/qrc_resource.cpp] Error 1
t在进行debug时,出现这个错误,去资源文件夹,用资源编辑器打开resource.qrc文件,查看是否有标红的资源文件. 如果有红色名称的资源文件,那么就是因为缺少该资源文件,导致的这个错误. 改正 ...
- 进制转换器V1.0_Beta
一.截图部分 二.代码部分: char2num() 作用:将字符转化成对应的数字 e.g. '9'->9 'A'->10 int char2num(char ch) ...
- Java之通过接口获取数据并用JDBC存储到数据库中
最近做数据同步功能,从接口获取数据然后存到数据库中以便后续对数据进行相关操作,下面就贴一下相关代码. import com.alibaba.fastjson.JSON; import com.alib ...