题目链接: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. spring声明式事务(@Transactional)开发常犯的几个错误及解决办法

    spring声明式事务(@Transactional)开发常犯的几个错误及解决办法 目前JAVA的微服务项目基本都是SSM结构(即:springCloud +springMVC+Mybatis),而其 ...

  2. Mac 上 snail svn 配置验证信息

    这样就不用每次都得输入svn的账号 和 密码了

  3. CentOS7环境源码安装freeswitch1.10.7

    操作系统 :CentOS 7.6_x64 freeswitch版本 :1.10.7 一.安装步骤 1.下载freeswitch源代码 wget http://files.freeswitch.org/ ...

  4. NC15172 情人节的电灯泡

    题目链接 题目 题目描述 情人节到了,小芳和小明手牵手,打算过一个完美的情人节,但是小刚偏偏也来了,当了一个明晃晃的电灯泡,小明很尴尬,就和小刚说,我交给你个任务,你完成了我俩就带你玩,否则你就回家吧 ...

  5. Typora关于 插入图片 居中 靠左 靠右设置

    style="float: left;" <img src="C:\Users\mlx\AppData\Roaming\Typora\typora-user-ima ...

  6. Spring异步任务async介绍与案例实战

    关于spring异步任务 简单地说,用@Async注释bean的方法将使其在单独的线程中执行.换句话说,调用者不会等待被调用方法的完成.利用spring提供的注解即可简单轻松的实现异步任务处理. 默认 ...

  7. python列表操作的大O效率

  8. python中partial用法

    应用 典型的,函数在执行时,要带上所有必要的参数进行调用.然后,有时参数可以在函数被调用之前提前获知.这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用. 示例pyqt5 ...

  9. java+mysql数据库实现的学生管理系统

    说明: java+mysql数据库实现的学生管理系统 功能 实现增加学生.删除学生.修改学生.学生列表.查询学生功能 截图: 开发工具/技术 java  eclipse 价格:50元,有需要联系 微信 ...

  10. 第120篇: DOM编程(常用操作、动态脚本、样式及动态表格)

    好家伙,我回来了, 本篇为<JS高级程序设计>第十四章"DOM编程"学习笔记   1.DOM编程 我们知道DOM是HTML文档的编程接口, 我们可以通过HTML代码实现 ...