题目链接:

https://vjudge.net/problem/UVA-519

思路:

剪枝+回溯

这个题巧妙的是他按照表格的位置开始搜索,也就是说表格是定的,他不断用已有的图片从(0,0)开始拼到(n-1,m-1)

剪枝的地方:

1.由于含'F'的面只能拼到边上,所以'F'的个数就是矩形的周长

2.含'O'的数目应该和含'I'的数目相等

3.可能会有很多重复的碎片,如果前面的碎片不能拼上去,那么后面重复的碎片也不能拼上去

坑点:

题目中明明说了只有15块碎片,但是将数组大小开到20却WA!!,说明碎片数目已经超过15个

#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char maze[100][5];
int n,m;
int F=0,I=0,O=0;
int vis[100];
char loc[100][100][5];
int cmp(const void *a,const void *b){
return strcmp((char*)a,(char*)b);//strcmp()不能直接判断二维数组的大小
}
int check(int cur,int i,int j){//top, right, bottom, and left
if(i==0&&maze[cur][0]!='F') return 0;
if(i==n-1&&maze[cur][2]!='F') return 0;
if(j==0&&maze[cur][3]!='F') return 0;
if(j==m-1&&maze[cur][1]!='F') return 0;
if(i>0&&(maze[cur][0]+loc[i-1][j][2]!='I'+'O')) return 0;
if(j>0&&(maze[cur][3]+loc[i][j-1][1]!='I'+'O')) return 0;
return 1;
}
int dfs(int x,int y,int cnt){
if(cnt==n*m){//
return 1;
}
char tmp[5]={0};
for(int k=0;k<n*m;k++){
if(!vis[k]&&(strcmp(tmp,maze[k])!=0)&&check(k,x,y)){
strcpy(tmp,maze[k]);
strcpy(loc[x][y],maze[k]); vis[k]=1;
if(dfs((cnt+1)/m,(cnt+1)%m,cnt+1)) return 1; vis[k]=0;
}
}
return 0;
}
void init(){
memset(maze,0,sizeof(maze));
memset(vis,0,sizeof(vis));
memset(loc,0,sizeof(loc));
F=0,I=0,O=0;
}
int main(int argc, char** argv) {
while(scanf("%d %d",&n,&m)!=EOF){
if(n==0&&m==0) break;
init(); for(int i=0;i<n*m;i++){
scanf("%s",maze[i]);
for(int j=0;j<4;j++){
if(maze[i][j]=='F') F++;
else if(maze[i][j]=='I') I++;
else if(maze[i][j]=='O') O++;
}
}
if(F!=(m+n)*2||I!=O){
printf("NO\n");
}else{
qsort(maze[0],n*m,sizeof(maze[0]),cmp);//q int Find=dfs(0,0,0);
if(Find) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}

Puzzle (II) UVA - 519的更多相关文章

  1. GCD - Extreme (II) UVA - 11426(欧拉函数!!)

    G(i) = (gcd(1, i) + gcd(2, i) + gcd(3, i) + .....+ gcd(i-1, i)) ret = G(1) + G(2) + G(3) +.....+ G(n ...

  2. GCD - Extreme (II) UVA - 11426 数学

    Given the value of N , you will have to nd the value of G . The de nition of G is given below: G = i ...

  3. CodeForces 303B Rectangle Puzzle II

    题意: 给定一个靠着坐标轴长为n,宽为m的矩形和 矩形中的一个点A,求在这个矩形内部一个 长宽比为a/b的小矩形,使这个小矩形的长宽尽量大使点A在小矩形内部,并且点A尽量靠近小矩形的中心 CF的思维题 ...

  4. Super Poker II UVA - 12298 FFT_生成函数

    Code: #include<bits/stdc++.h> #define maxn 1000000 #define ll long long #define double long do ...

  5. GCD - Extreme (II) UVA - 11426 欧拉函数_数学推导

    Code: #include<cstdio> using namespace std; const int maxn=4000005; const int R=4000002; const ...

  6. F - GCD - Extreme (II) UVA - 11426

    Given the value of N, you will have to find the value of G. The definition of G is given below:

  7. GCD - Extreme (II) UVA - 11426 欧拉函数与gcd

    题目大意: 累加从1到n,任意两个数的gcd(i,j)(1=<i<n&&i<j<=n). 题解:假设a<b,如果gcd(a,b)=c.则gcd(a/c,b ...

  8. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  9. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

随机推荐

  1. CPU的功能和基本组成结构

    目录 CPU的功能 运算器和控制器的功能 CPU的基本结构 运算器的基本结构 控制器的基本结构 整体 本节回顾 CPU的功能 指令控制:完成取指令.分析指令和执行指令的操作,即程序的顺序控制 操作控制 ...

  2. css进阶 07-CSS面试题

    07-CSS面试题 #常见问题 #你是如何理解 HTML 语义化的? 语义化:指对文本内容的结构化(内容语义化),选择合乎语义的标签(代码语义化). 举例:段落用 p,边栏用 aside,主要内容用 ...

  3. js上 十四、对象

    十四.对象 #1.初识对象 什么是对象? 在js中,一切皆是对象. 对象,生活中可见和不可见的东西,在世界中,客观存在的都是一个对象. 桌子,笔记本,手机,人. 在日常生活中,我们是如何来描述这个对象 ...

  4. 第三章 Nacos Discovery--服务治理

    之前我讲过 Nacos文章 的内容,想要深入了解的 朋友的话,可以去看看 ,我们继续承接上篇讲下去 --> 第二章 : 微服务环境搭建 3.1 服务治理介绍 先来思考一个问题 通过上一章的操作, ...

  5. oracle rm -fr datafile 数据文件被误删的场景恢复(没有rman备份)

    环境: Linux release 7.5 oracle19c (无pdb,从11.2.0.4升级上去的) 一:单个非系统表空间的数据文件被删除 我先备份一下,虽然是测试环境. [oracle@19c ...

  6. Python循环列表的方法

    python循环列表的几种方法: 第一,依次打印列表中的各项值. 1 #!usr/bin/env python3 2 #!-*- Coding:utf-8 -*- 3 4 ''' 5 多种循环列表的方 ...

  7. C# 高并发、抢单解决思路

    高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求.高并发相关常用的一些指标有响应时间(Respon ...

  8. Windows安装VsCode 和Nodejs Vue

    一.安装VSCode 1.在官网下载并安装VSCode https://code.visualstudio.com/Download 注意:解压到非系统盘(节约系统盘空间,也方便后面使用) 文件夹最好 ...

  9. 【命令】man命令帮助文档详解

    前言:Linux命令分为内建命令和外部命令:内建命令是shell本身自带的,外部命令是是一个可执行程序 我们在使用命令帮助的时候需要钱哦区分命令是内建命令还是外部命令 一.查看一个命令是内建命令还是外 ...

  10. Redis基础篇(二)高性能IO模型

    我们经常听到说Redis是单线程的,也会有疑问:为什么单线程的Redis能那么快? 这里要明白一点:Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的,这也是Redis对 ...