#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define Up num[0]
#define Right num[1]
#define Down num[2]
#define Left num[3] char ca,cb,cc,cd;
int r,c,rc;
bool v[]; class Jigsaw
{
public:
int serialNumber;
char num[];
public:
void readIn()
{
scanf("%d%*c%c%*c%c%*c%c%*c%c%*c",&serialNumber,num,num+,num+,num+);
}
void printOut()
{
printf("%d %c %c %c %c\n",serialNumber,num[],num[],num[],num[]);
}
int checkCorner()
{
int i;
for (i=; i<; i++)
{
if (num[i] == '' && num[(i+)%] == '')
return i;
}
return -;
}
int checkSuit2c()
{
int i;
for (i=; i<; i++)
{
if (num[i] == ca && num[(i+)%] == cb)
return i;
}
return -;
}
int checkSuit3c()
{
int i;
for (i=; i<; i++)
{
if (num[i] == ca && num[(i+)%] == cb && num[(i+)%] == cc)
return i;
}
return -;
}
int checkSuit4c()
{
int i;
for (i=; i<; i++)
{
if (num[i] == ca && num[(i+)%] == cb && num[(i+)%] == cc)
return i;
}
return -;
}
};
Jigsaw js[];
Jigsaw tb[][];
bool check_and_rotate(int x,int y,int d)
{
int t;
if (x == && y == )
{
t=js[d].checkCorner();
if (t == -)
return false;
tb[x][y].serialNumber=js[d].serialNumber;
tb[x][y].Left=js[d].num[t];
tb[x][y].Up=js[d].num[(t+)%];
tb[x][y].Right=js[d].num[(t+)%];
tb[x][y].Down=js[d].num[(t+)%];
return true;
}
if (x == )
cb='';
else
cb=tb[x-][y].Down;
if (y == )
ca='';
else
ca=tb[x][y-].Right;
if (y == c-)
{
cc='';
t=js[d].checkSuit3c();
if (t == -)
return false;
tb[x][y].serialNumber=js[d].serialNumber;
tb[x][y].Left=js[d].num[t];
tb[x][y].Up=js[d].num[(t+)%];
tb[x][y].Right=js[d].num[(t+)%];
tb[x][y].Down=js[d].num[(t+)%];
return true;
}
else if (x == r-)
{
cc='';
t=js[d].checkSuit4c();
if (t == -)
return false;
tb[x][y].serialNumber=js[d].serialNumber;
tb[x][y].Left=js[d].num[t];
tb[x][y].Up=js[d].num[(t+)%];
tb[x][y].Right=js[d].num[(t+)%];
tb[x][y].Down=js[d].num[(t+)%];
return true;
}
else
{
t=js[d].checkSuit2c();
if (t == -)
return false;
tb[x][y].serialNumber=js[d].serialNumber;
tb[x][y].Left=js[d].num[t];
tb[x][y].Up=js[d].num[(t+)%];
tb[x][y].Right=js[d].num[(t+)%];
tb[x][y].Down=js[d].num[(t+)%];
return true;
}
return false;
}
bool DFS(int x,int y)
{
int i,j;
if (y == c)
{
x++;
y=;
if (x == r)
{
for (i=; i<r; i++)
{
for (j=; j<c; j++)
{
tb[i][j].printOut();
}
}
return true;
}
return DFS(x,y);
}
for (i=; i<rc; i++)
{
if (v[i] == true)
continue;
if (check_and_rotate(x,y,i) == true)
{
v[i]=true;
if (DFS(x,y+) == true)
return true;
v[i]=false;
}
}
return false;
}
int main()
{
int i,j;
scanf("%d%d",&r,&c);
rc=r*c;
for (i=; i<rc; i++)
{
js[i].readIn();
v[i]=false;
}
DFS(,);
return ;
}

USACO Elite 2008 December Competition Silver

题意:给你一些正方形的拼图碎块,每个碎块有四个边,每边都有一个记号,分别是小写字母a-z。其中没有标记的边,也就是边界的边用'0'标记。题目给定一个矩阵,把这些碎块放进去,要求每个边相接的记号必须一样,边界上的边必须是'0'。

解法:DFS。这个操作起来还是挺麻烦的,做处理的时候要小心一些。

[Elite 2008 Dec USACO]Jigsaw Puzzles的更多相关文章

  1. [usaco] 2008 Dec Largetst Fence 最大的围栏 2 || dp

    原网站大概已经上不了了-- 题目大意: 求出平面上n个点组成的一个包含顶点数最多的凸多边形.n<=250. 考虑我们每次枚举凸包的左下角为谁(参考Graham求凸包时的左下角),然后像Graha ...

  2. BZOJ 1606 USACO 2008 Dec. 购买干草

    [题意概述] 有n件物品,每件物品有体积Vi,背包容量为C,问最多可以装多少体积的物品 [题解] 显然是个无限背包嘛.. 直接做背包DP就好 注意无限背包的写法和01背包的区别 #include< ...

  3. 【洛谷P2927 [USACO08DEC]拼图游戏Jigsaw Puzzles】深搜

    其实,随便搜了一搜就可以AC了!!! - - 亏我纠结了这么久= = #include<cstdio> #include<cstdlib> #include<cstrin ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. Self-Supervised Representation Learning

    Self-Supervised Representation Learning 2019-11-11 21:12:14  This blog is copied from: https://lilia ...

  6. LOJ10199轻拍牛头

    题目描述 原题来自:USACO 2008 Dec. Silver 今天是 Bessie 的生日,并且现在是聚会的游戏时间.Bessie 让编号为 1~N 的 N 头奶牛围成一个圈坐(所以除了最后一头牛 ...

  7. tcmalloc资料

    1. 确定dylib在max os是可以成功的. http://lists.apple.com/archives/perfoptimization-dev/2008/Dec/msg00002.html ...

  8. ICCV 2017论文分析(文本分析)标题词频分析 这算不算大数据 第一步:数据清洗(删除作者和无用的页码)

    IEEE International Conference on Computer Vision, ICCV 2017, Venice, Italy, October 22-29, 2017. IEE ...

  9. 2016CVPR论文集

    http://www.cv-foundation.org/openaccess/CVPR2016.py ORAL SESSION Image Captioning and Question Answe ...

随机推荐

  1. ARM汇编语言

    ---恢复内容开始--- arm汇编语言 汇编语言是一种程序设计语言,arm处理器是一种16/32位的嵌入式RISC微处理器.一开始我把这混为一谈了.ARM汇编的特点:汇编语言,又叫助记符语言. 1) ...

  2. 关于DE2-115 FPGA开发板无法烧写程序的解决方法

    友晶科技推出的DE2-115 FPGA开发板,有时候莫名奇妙,无法烧写或者固化程序.利用JTAG 向DE2-115开发板烧写.sof文件失败,并提示以下错误,如图1和图2所示 图1 图2 解决方法:只 ...

  3. #400 – 使用ItemsPanel 属性将WrapPanel 作为ListBox的显示面板(Using a WrapPanel as the Items Panel for a ListBox)

    原文:#400 – 使用ItemsPanel 属性将WrapPanel 作为ListBox的显示面板(Using a WrapPanel as the Items Panel for a ListBo ...

  4. ISP与IAP

    ISP:in system program 顾名思义,在系统编程,单片机不用从电路上拆下,直接用下载器或者串口即可完成程序的烧写.这个是用于工程师调试程序,或者出厂时烧写程序.本质上是芯片出厂时烧录到 ...

  5. quartz 任务高度的动态修改

    package com.example.demo.controller; import org.quartz.*;import org.quartz.impl.StdSchedulerFactory; ...

  6. P3871 [TJOI2010]中位数

    傻逼题 维护两个系统堆即可 #include<bits/stdc++.h> #define il inline #define vd void typedef long long ll; ...

  7. java日志框架log4j详细配置及与slf4j使用教程

    一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” 1 2 3 4 5 <dependen ...

  8. Object C学习笔记4-内存管理

    Object-C的内存管理和.NET有些不一样,.NET的内存回收机制是使用GC自动处理回收,而Object-C本质上还是C语言,所以很多时候还是需要手动去管理内存回收. 1. Object-C生成一 ...

  9. 由 Session 和 Cookie 的区别说起

    Session 和 Cookie 有什么区别? 最近面试被问到这个问题,和面试官一番讨论了解到面试官心里的答案后,我不太满意. 面对上面的问题,如果是刚毕业时的我,一定会毫不犹豫说出 Cookie 是 ...

  10. RegExp正则匹配模式汇总

    正则表达式提供另一种强大的文本搜索和处理方式,对于正则表达式,不同语言有着不同的实现,JavaScript采用的Perl5的语法.对于极少数匹配模式是简单的全字符文本的情况,我们往往会采用indexO ...