题目链接:problem D

解法:

  1. 比较简单。看代码。
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Set;
import java.util.TreeSet; public class Main {
static int n, h, w;
static int[][] ties; static boolean[][] writed ; static boolean[] used; static boolean over = false; static Set<Integer> set = new TreeSet<>();
public static void main(String[] args) throws IOException {
StreamTokenizer st = new StreamTokenizer(new InputStreamReader(System.in));
st.nextToken();
n = (int) st.nval;
st.nextToken();
h = (int) st.nval;
st.nextToken();
w = (int) st.nval; ties = new int[n][2];
for (int i = 0; i < n; i++) {
st.nextToken();
int a = (int) st.nval;
st.nextToken();
int b = (int) st.nval;
ties[i][0] = a;
ties[i][1] = b;
}
writed = new boolean[h][w];
used = new boolean[n];
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
set.add(i*w+j);
}
}
dfs(0,0,0);
System.out.println(over?"Yes":"No");
} public static boolean canplace(int i,int topx,int topy,int dir){
int r = ties[i][dir];
int c = ties[i][1-dir];
for(int x=topx;x<topx+r;x++){
if( x<0 || x >=h) {
return false;
}
for(int y=topy;y<topy+c;y++){
if( y<0 || y>=w) {
return false;
}
if(writed[x][y]) {
return false;
}
}
}
return true;
} public static void place(int i,int topx,int topy,int dir){
int r = ties[i][dir];
int c = ties[i][1-dir];
for(int x=topx;x<topx+r;x++){
for(int y=topy;y<topy+c;y++){
writed[x][y] = true;
set.remove(x*w + y);
}
}
used[i] = true;
} public static boolean check() {
if( set.isEmpty()) {
return true;
}
return false;
} public static void replace(int i,int topx,int topy,int dir) {
int r = ties[i][dir];
int c = ties[i][1-dir];
for(int x=topx;x<topx+r;x++){
for(int y=topy;y<topy+c;y++){
writed[x][y] = false;
set.add(x*w + y);
}
}
used[i] = false;
} public static void dfs(int depth,int topx,int topy) {
if(over) {
return;
} if( check()){
over = true;
return;
} for(int i=0;i<n;i++){
for(int dir=0;dir<=1;dir++) {
if (!used[i] && canplace(i, topx, topy, dir)) {
place(i, topx, topy, dir);
if(check()){
over = true;
return;
}
int[] next = update();
dfs(depth + 1, next[0],next[1]);
replace(i, topx, topy, dir);
}
}
}
} public static int[] update() {
int u = set.stream().findFirst().orElse(0);
return new int[]{u/w,u%w};
} }

【At Coder begin 345】[D - Tiling] 回溯的更多相关文章

  1. DFS 算法总结

    DFS 算法总结 这篇文章会对DFS进行一个总结,列举的题目则是从LeetCode上面选的: 适用场景: 有三个方面,分别是输入数据.状态转换图.求解目标: 输入数据:如果是递归数据结构,如单链表,二 ...

  2. cppjieba分词学习笔记

    cppjieba分词包主要提供中文分词.关键词提取.词性标注三种功能 一.分词 cppjieba分词用的方法是最大概率分词(MP)和隐马尔科夫模型(HMM),以及将MP和HMM结合成的MixSegme ...

  3. JavaScript---设计模式之职责链模式

    概念 职责链模式是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 链中收到请求的对象要么亲自处理它,要 ...

  4. generating permunation——全排列(算法汇总)

    本文一共提供了4种全排列的方法,包括递归非字典序版本.递归字典序版本.标准库版本和BFS字典序版本,当然BFS非字典序实现相对于BFS字典序版本更加简洁,稍加修改即可. 说明:递归版本基于网上现有代码 ...

  5. 小菜鸟之oracle

    oracle 存储过程 函数 创建 删除 参数 传递 函数 查看 包 系统包 分类: Oracle 2011-10-27 17:31 264人阅读 评论(0) 收藏 举报   认识存储过程和函数 存储 ...

  6. Begin the new life as a coder

    今天刚刚开通博客园的博客频道,这里将成为自我成长点滴记录的土壤!从今天开始,从这篇博文开始,我将分享自己从一个fresher开始的成长经历.原与广大仁人志士共同在程序中共享快乐!我真是太高兴了 :D

  7. [LeetCode] Combination Sum 回溯

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...

  8. HDU 5113 Black And White 回溯+剪枝

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...

  9. HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. 【题解】【排列组合】【回溯】【Leetcode】Gray Code

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

随机推荐

  1. Nebula Siwi:基于图数据库的智能问答助手思路分析

      本文重点分析 Nebula Siwi 智能问答思路,具体代码可参考[2],使用的数据集为 Basketballplayer[3].部分数据和 schema 如下所示: 一.智能问答可实现的功能 1 ...

  2. mit6.824lab2D-Debug记录

    1.死锁 要提交快照的时候由于没有人取走applyCh通道里面的东西,导致死锁. 具体解释: 2D的测试代码中在日志达到一定大小时会调用snapshot,该函数需要申请rf.mu这个互斥锁.而在提交普 ...

  3. Java 数字 默认是 Integer类型的问题,System.currentTimeMillis() + (180 * 24 * 60 * 60 * 1000)的问题,剖析、Long + Integer的问题

    最终结论: (180 * 24 * 60 * 60) 这种计算表达式在 Java中是默认以 Integer类型来的,若不超过 Integer的最大值则没有问题,若超过则必须用 (180 * 24 * ...

  4. MySQL中 int(11)和int(10)有没有区别!!

    结论:int(11)  int(3)  int(20)  若不勾选填充0,那么效果统统一样,若勾选了填充0:查询出来的效果 会是这样: int(11)  00000000123 int(3)  123 ...

  5. JS 前序遍历、中序遍历、后序遍历、层序遍历详解,深度优先与广度优先区别,附leetcode例题题解答案

    壹 ❀ 引 按照一天一题的速度,不知不觉已经刷了快两多月的leetcode了,因为本人较为笨拙,一道简单的题有时候也会研究很久,看着提交了两百多次,其实也才解决了70来道简单题,对于二分法,双指针等也 ...

  6. Spring Boot图书管理系统项目实战-6.图书管理

    导航: pre:  5.读者管理 next:7.借阅图书 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 book.html ...

  7. Spring boot 2.0启动自动执行sql语句

    项目地址:https://gitee.com/indexman/spring_boot_in_action 1.准备sql文件 将department.sql放到resources路径下 /* Nav ...

  8. html中iframe调用兄弟iframe中的js方法

    问题说明 最近工作中碰到一个页面有一个主iframe A,用于操作主要业务元素.其中有一个弹出框里面也嵌入了一个iframe B, 此时,我需要在B中调用A中JS的指定方法.下面咱们来通过例子还原一下 ...

  9. windows 上 ffmpeg 库的安装

    真复杂啊 安装 ffmpeg 库有两种途径,一种是自己下载源码再去编译,另一种是使用 vcpkg 自动安装 一般情况下,第二种是最简单方便的,但是如果你需要使用 ffmpeg 的特定历史版本,那就有点 ...

  10. 【Android逆向】apk 反编译

    1. Kali搭建apktool环境 1. 访问apktool 官网https://ibotpeaches.github.io/Apktool/install/ 参考红圈里的步骤处理即可 2. 执行命 ...