[Elite 2008 Dec USACO]Jigsaw Puzzles
#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的更多相关文章
- [usaco] 2008 Dec Largetst Fence 最大的围栏 2 || dp
原网站大概已经上不了了-- 题目大意: 求出平面上n个点组成的一个包含顶点数最多的凸多边形.n<=250. 考虑我们每次枚举凸包的左下角为谁(参考Graham求凸包时的左下角),然后像Graha ...
- BZOJ 1606 USACO 2008 Dec. 购买干草
[题意概述] 有n件物品,每件物品有体积Vi,背包容量为C,问最多可以装多少体积的物品 [题解] 显然是个无限背包嘛.. 直接做背包DP就好 注意无限背包的写法和01背包的区别 #include< ...
- 【洛谷P2927 [USACO08DEC]拼图游戏Jigsaw Puzzles】深搜
其实,随便搜了一搜就可以AC了!!! - - 亏我纠结了这么久= = #include<cstdio> #include<cstdlib> #include<cstrin ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Self-Supervised Representation Learning
Self-Supervised Representation Learning 2019-11-11 21:12:14 This blog is copied from: https://lilia ...
- LOJ10199轻拍牛头
题目描述 原题来自:USACO 2008 Dec. Silver 今天是 Bessie 的生日,并且现在是聚会的游戏时间.Bessie 让编号为 1~N 的 N 头奶牛围成一个圈坐(所以除了最后一头牛 ...
- tcmalloc资料
1. 确定dylib在max os是可以成功的. http://lists.apple.com/archives/perfoptimization-dev/2008/Dec/msg00002.html ...
- ICCV 2017论文分析(文本分析)标题词频分析 这算不算大数据 第一步:数据清洗(删除作者和无用的页码)
IEEE International Conference on Computer Vision, ICCV 2017, Venice, Italy, October 22-29, 2017. IEE ...
- 2016CVPR论文集
http://www.cv-foundation.org/openaccess/CVPR2016.py ORAL SESSION Image Captioning and Question Answe ...
随机推荐
- [shell]关闭超时的进程
应同事要求,写了个shell, 主要功能为查找超时的进程,并关闭! 调用方式: shell_sheep : 为进程名 30 : 为30分钟 从打印的日志能看出会多两个PID,不要惊慌,由于你执行时会 ...
- 【转载】COM 组件设计与应用(十五)——连接点(vc6.0)
原文:http://vckbase.com/index.php/wv/1256.html 一.前言 上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了. 二.原理 图一.连接点组件原理图.左侧 ...
- 远心镜头(Telecentric lens)原理介绍
远心镜头(Telecentric lens)原理介绍 远心镜头(Telecentric lens),是为纠正传统镜头视差而设计,它可以在一定的物距范围内,使得到的图像放大倍率不会变化,简单的说这种镜头 ...
- 前端- css - 总结
1.css层叠样式表 1.什么是CSS? CSS是指层叠样式表(Cascading Style Sheets),样式定义如何显示HTML元素,样式通常又会存在于样式表中. 也就是说把HTML元素的样式 ...
- SpringCloud-微服务网关ZUUL(六)
前言:前面说过,由于微服务过多,可能某一个小业务就需要调各种微服务的接口,不可避免的就会需要负载均衡和反向代理了,以确保ui不直接与所有的微服务接口接触,所以我们需要使用一个组件来做分发,跨域等各种请 ...
- Codeforces 909E. Coprocessor (拓扑、模拟)
题目链接: Coprocessor 题意: 给出n个待处理的事件(0 - n-1),再给出了n个标(0表示只能在主处理器中处理这个事件,1表示只能在副处理器中处理这个事件),处理器每次能处理多个任务. ...
- 在使用Reference Source调试.Net 源代码时如何取消optimizations(代码优化)-翻译
在使用PDB调试XAF时,发现好多变量都看不到.都被优化掉了. 下面的方法可以解决. 当你在使用Reference Source functionality in VS 2008 调试.Net 的源代 ...
- VRRP+tunnel+IP SLA+Track实现冗余切换
IP SLA(Internet Protocol Service-Level Agreement)互联网服务等级协议,本实验里通过发送测试报文,测试下一跳是否可达,结合Track实现冗余静态路由的切换 ...
- Shuffle Bags让你的随机不那么随机
前言 当我最初写游戏时,我经常使用标准Random()函数,然后写一堆if和else条件来我获得预期结果.如果结果不太好,我会写更多的条件进行过滤或者筛选,直到我觉得游戏变得有趣.最近我发现有更好的方 ...
- 从零开始的Python学习Episode 17——序列化
序列化 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语 言中也被称之为serialization,marshalling,flattenin ...