题目链接: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. 小知识:使用MOS下载Oracle介质快速参考

    之前对选Release.Patch Set.PSU都有专门的文档,现在早已简化,针对这些以及之后RU.RUR等都包含在MOS文档:2118136.2 Assistant: Download Refer ...

  2. 安装TFA用于快速收集RAC各类日志

    TFA一般主要用于Oracle RAC环境一键收集需要的日志进行分析问题,解决传统人工收集集群.数据库等各类日志效率低下的问题.具体关于TFA的介绍,网上资料已经非常多,在此不再赘述. TFA的安装也 ...

  3. IDE 不用鼠标 向下选择

  4. 反编译工具Jadx for MAC 安装与配置

    Jadx安装与配置 安装jadx brew install jadx 配置环境变量 先找到java安装位置 (base) # chen at Little-M1-Wrok in /usr/bin [1 ...

  5. NC16679 [NOIP2003]神经网络

    题目链接 题目 题目描述 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络 ...

  6. NC50940 Running Median

    题目链接 题目 题目描述 For this problem, you will write a program that reads in a sequence of 32-bit signed in ...

  7. 【framework】View添加过程

    1 前言 WMS启动流程 中介绍了 WindowManagerService 的启动流程,本文将介绍 View 的添加流程,按照进程分为以下2步: 应用进程:介绍从 WindowManagerImpl ...

  8. MYSQL服务无法启动:InnoDB: .\ibdata1 can't be opened in read-write mode

    今天在那做实验倒腾mysql数据库,后来发现服务无法启动,查看日志报错如下: 2015-01-07 17:48:54 9136 [ERROR] InnoDB: .\ibdata1 can't be o ...

  9. 使用ORACLE外部表装载复杂数据

    原文:http://www.oracle.com/technetwork/issue-archive/2013/13-jan/o13asktom-1886639.html I am using SQL ...

  10. Java并发编程实例--5.线程睡眠

    有时候我们需要让线程在一段时间内不做任何事.例如某线程每个一小时检测一下传感器,剩余的时间不做任何事. 我们可以使用sleep()方法使线程睡眠,此期间不占用计算机资源. 这个方法接受一个整数表示睡眠 ...