地址 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的更多相关文章

  1. 算法问题实战策略 PICNIC

    下面是另一道搜索题目的解答过程题目是<算法问题实战策略>中的一题oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/PICNIC ...

  2. 《算法问题实战策略》-chaper7-穷举法

    关于这一章节<算法实战策略>有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作.相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者 ...

  3. 《算法问题实战策略》-chaper32-网络流

    基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”. 流问题的基本概念: 首先给出一张图. 其实所谓 ...

  4. 《算法问题实战策略》-chaper13-数值分析

    这一章节主要介绍我们在进行数值分析常用的二分.三分和一个近似求解区间积分的辛普森法. 首先介绍二分. 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解 ...

  5. 《算法问题实战策略》——chaper9——动态规划法技巧

    Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1)    拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2)    棋盘中还剩 ...

  6. 《算法问题实战策略》-chaper8-动态规划法

    Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...

  7. 《算法问题实战策略》-chaper21-树的实现和遍历

    这一章节开始介绍一个数据结构中的一个基本概念——树. 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列.数组和链表等结构表征),还有一个重要的特性——层级结构 ...

  8. 算法问题实战策略 QUADTREE

    地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...

  9. 算法问题实战策略 DICTIONARY

    地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...

随机推荐

  1. 在IIS上部署 .Net Core 3.0 项目踩坑实录

    在IIS上部署 .Net Core 3.0 项目的主要流程有: 安装并启用IIS 安装AspNetCoreModuleV2 添加.配置网站 设置应用程序池 通过VS发布 一.安装并启用IIS: 安装了 ...

  2. Flask 模板语言,装饰器

      Jinja2模板语言 # -*- coding: utf-8 -*-   from flask import Flask, render_template, request, redirect,  ...

  3. DotNet Core中使用RabbitMQ

    上一篇随笔记录到RabbitMQ的安装,安装完成,我们就开始使用吧. RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协 ...

  4. 开启Hyper-V

    开启Hyper-V 添加方法非常简单,把以下内容保存为.cmd文件,然后以管理员身份打开这个文件.提示重启时保存好文件重启吧,重启完成就能使用功能完整的Hyper-V了. pushd "%~ ...

  5. Angular-----代码风格指南!!!(很重要)

    一:文件结构 1).单一规则:坚持每个文件只定义一样东西(例如服务或组件),考虑把文件大小限制在 400 行代码以内. 单组件文件非常容易阅读.维护,并能防止在版本控制系统里与团队冲突: 单组件文件可 ...

  6. 团队项目之测试与发布(Alpha版本)

    小组:BLACK PANDA 时间:2019.12.05 测试报告 1.测试找出的BUG 图片上传,文件过大会出错 用户可访问不具权限的URL 空字段导致异常 serializable反序列化时版本不 ...

  7. (办公)记事本_Linux目录

    转载自菜鸟教程:https://www.runoob.com/linux/linux-system-contents.html /bin: bin是Binary的缩写, 这个目录存放着最经常使用的命令 ...

  8. 常用注解解析(因为不太明白@component和@configuration写了)

    1.@controller 控制器(注入服务) 用于标注控制层,相当于struts中的action层 2.@service 服务(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理 3.@rep ...

  9. mysql5.7中timestam默认值'0000-00-00 00:00:00'报错

    在mysql5.7中设置 timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'会报错: 解决办法: mysql> set sql_mode='NO_A ...

  10. CSV和JSON格式相互转换

    1.为什么要进行CSV与JSON格式之间的转换 CSV格式常用于一二维数据表示和存储,他是一种纯文本形式存储表格数据的表示方式.JSON也可以表示一二维数据.在网络信息传输中,可能需要统一表示方式,因 ...