【At Coder begin 345】[D - Tiling] 回溯
题目链接:problem D
解法:
- 比较简单。看代码。
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] 回溯的更多相关文章
- DFS 算法总结
DFS 算法总结 这篇文章会对DFS进行一个总结,列举的题目则是从LeetCode上面选的: 适用场景: 有三个方面,分别是输入数据.状态转换图.求解目标: 输入数据:如果是递归数据结构,如单链表,二 ...
- cppjieba分词学习笔记
cppjieba分词包主要提供中文分词.关键词提取.词性标注三种功能 一.分词 cppjieba分词用的方法是最大概率分词(MP)和隐马尔科夫模型(HMM),以及将MP和HMM结合成的MixSegme ...
- JavaScript---设计模式之职责链模式
概念 职责链模式是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 链中收到请求的对象要么亲自处理它,要 ...
- generating permunation——全排列(算法汇总)
本文一共提供了4种全排列的方法,包括递归非字典序版本.递归字典序版本.标准库版本和BFS字典序版本,当然BFS非字典序实现相对于BFS字典序版本更加简洁,稍加修改即可. 说明:递归版本基于网上现有代码 ...
- 小菜鸟之oracle
oracle 存储过程 函数 创建 删除 参数 传递 函数 查看 包 系统包 分类: Oracle 2011-10-27 17:31 264人阅读 评论(0) 收藏 举报 认识存储过程和函数 存储 ...
- Begin the new life as a coder
今天刚刚开通博客园的博客频道,这里将成为自我成长点滴记录的土壤!从今天开始,从这篇博文开始,我将分享自己从一个fresher开始的成长经历.原与广大仁人志士共同在程序中共享快乐!我真是太高兴了 :D
- [LeetCode] Combination Sum 回溯
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...
- HDU 5113 Black And White 回溯+剪枝
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...
- HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【题解】【排列组合】【回溯】【Leetcode】Gray Code
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
随机推荐
- 用superxmlparser.pas的XMLParseString----XML转Json注意
了解XML转成Json时候用的时候多了个#号: ---------------------------------------------------------------------------- ...
- 深入读懂 Kafka集群
前言 概述 Kafka是一个多分区.多副本的分布式流处理平台,以高吞吐.可持久化.可水平扩展.支持流数据处理等多种特性被广泛使用. 应用场景 (1)缓冲削峰:有利于解决生产消息和消费消息的处理速度不一 ...
- NEMU PA 4 实验报告
一.实验目的 在前面的PA123中,我们分别实现了基本的运算单元,实现了各种指令和程序的装载,实现了存储器的层次结构.而在PA4中,为了让NEMU可以处理异常情况以及和外设交互,我们要做的事情有以下: ...
- UVA11573 Ocean Currents
题目链接 题目 见链接. 题解 知识点:BFS. 这道题显然用BFS,但发现洋流方向会破坏时间的有序性,但注意到洋流时间花费是 \(0\) ,因此只需要用双端队列即可,洋流方向扩展直接放队头,其他方向 ...
- NC20875 舔狗舔到最后一无所有
题目链接 题目 题目描述 作为队伍的核心,forever97很受另外两个队友的尊敬. Trote_w每天都要请forever97吃外卖,但很不幸的是宇宙中心forever97所在的学校周围只有3家fo ...
- wxPython 笔记
安装 Win7 / Win10 直接通过 pip install wxpython 安装 Ubuntu18.04 / Ubuntu 20.04 在Linux下的安装会稍微麻烦, 可以参考官网上的说明 ...
- C++ std::move 的一些问题
看 SO 上有一个比较奇怪的问题, When does an rvalue reference result in a move vs copy constructor and why? 问题代码: ...
- golang常用库包:redis操作库go-redis使用(03)-高级数据结构和其它特性
Redis 高级数据结构操作和其它特性 第一篇:go-redis使用,介绍Redis基本数据结构和其他特性,以及 go-redis 连接到Redis https://www.cnblogs.com/j ...
- kafka学习笔记01-kafka简介和架构介绍
一.kafka介绍 kafka 最开始是 Linkedin 用来处理海量的日志信息,后来 linkedin 于 2010 年贡献给了 Apache 基金会并成为了顶级项目. 后来开发 kafka 的一 ...
- linux下安装django2.2
安装 pip3 install django==2.2 创建项目 django-admin startproject pyweb 创建应用 django-admin startapp app01 修改 ...