现在zoj暂时关了,实际上是在scuoj上做的。

题目地址

看起来题目比较复杂,实际上主要需要思维的是如何恰当的剪枝及合适的DFS角度。

问题等价于将n*n个可能相同的方块放到一个n*n的表中,使满足题目要求的条件。由于放的时候是一个个放的,所以可以以此为切入点进行DFS,并且,只需要关注不同方块的种类,这样就可以极大的节约时间(从人做这件事的角度来看,相同的方块就像是相同的积木一样,人关注的只是相同的积木的形状以及个数。)

 #include<cstdio>
#include<cstring>
using namespace std;
int a[][],kind[],n,kge,b[][],cnt=,m;//a记录不同种类方块各方向的数,kind记录每种种类的个数,kge记录种类数
int dfs(int p)
{
if(p==m)//dfs成功的话,就是进行到第n*n次(这时前0——n*n-1都已经放好)
return ;
else
{
for(int i=;i<kge;i++)
{
if(kind[i]==)
continue;
else
{
if(p%n!=)//p%n时左侧就没有方块
{
if(b[p-][]!=a[i][])
continue;
}
if(p>=n)//p<n时在最上一行,上面就没有方块
{
if(b[p-n][]!=a[i][])
continue;
}
kind[i]--;
for(int j=;j<;j++)
{
b[p][j]=a[i][j];
}
if(dfs(p+))//继续dfs下一个位置
{
return ;
}
kind[i]++;//如果这样并不行,恢复至之前的状态
}
}
return ;
}
}
int main()
{
while(scanf("%d",&n))
{
kge=;
if(n==)
break;
else
{
int up,left,right,down,i,j;
m=n*n;
for(i=;i<m;i++)
{
scanf("%d%d%d%d",&up,&right,&down,&left);
for(j=;j<kge;j++)
{
if(a[j][]==up&&a[j][]==right&&a[j][]==down&&a[j][]==left)
{
kind[j]++;
break;
}
}
if(j==kge)//整体是对有无与之前的方块相同的判断
{
a[kge][]=up;
a[kge][]=right;
a[kge][]=down;
a[kge][]=left;
kind[kge]=;
kge++;
}
}
if(cnt)
puts("");//注意空行
if(dfs())
printf("Game %d: Possible\n",++cnt);
else
printf("Game %d: Impossible\n",++cnt);
}
}
return ;
}

(DFS)zoj1008-Gnome Tetravex的更多相关文章

  1. LeetCode Subsets II (DFS)

    题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) class Solution { publ ...

  2. LeetCode Subsets (DFS)

    题意: 给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计. class Sol ...

  3. HDU 2553 N皇后问题(dfs)

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在 ...

  4. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  5. 【算法导论】图的深度优先搜索遍历(DFS)

    关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS). 深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点, ...

  6. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  7. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  8. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  9. 搜索——深度优先搜索(DFS)

    设想我们现在身处一个巨大的迷宫中,我们只能自己想办法走出去,下面是一种看上去很盲目但实际上会很有效的方法. 以当前所在位置为起点,沿着一条路向前走,当碰到岔道口时,选择其中一个岔路前进.如果选择的这个 ...

  10. Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)

    Leetcode之深度优先搜索(DFS)专题-129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers) 深度优先搜索的解题详细介绍,点击 给定一个二叉树,它的每个结点都存放 ...

随机推荐

  1. arr.sort()排序方法

    <!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8&qu ...

  2. jquery实现全选、反选、不选

    <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8&quo ...

  3. Android 热补丁动态修复框架小结

    一.概述 最新github上开源了很多热补丁动态修复框架,大致有: https://github.com/dodola/HotFix https://github.com/jasonross/Nuwa ...

  4. Css_2跟3

    #css2中的选择器 1.元素选择器     *通配符选择符.html类型选择符.id选择符.class选择符 2.关系选择器     E F(包含选择器).E>F(子选择器).E+F(E元素后 ...

  5. K均值聚类(Kmeans)

    Sigma = [1, 0; 0, 1]; mu1 = [1, -1]; x1 = mvnrnd(mu1, Sigma, 200); mu2 = [5.5, -4.5]; x2 = mvnrnd(mu ...

  6. VC++编译MPIR 2.7.0

    目录 第1章编译    2 1.1 简介    2 1.2 下载    3 1.3 解决方案    4 1.4 创建项目    5 1.5 复制文件树    6 1.6 不使用预编译头文件    8 ...

  7. linux笔记:搜索命令find,locate,which,whereis,grep

    命令名称:find功能:文件搜索命令所在路径:/bin/find用法:find 搜索范围 匹配条件其他:举例:find /root -name initfind /root -size +1024fi ...

  8. [saiku] 使用 Apache Phoenix and HBase 结合 saiku 做大数据查询分析

    saiku不仅可以对传统的RDBMS里面的数据做OLAP分析,还可以对Nosql数据库如Hbase做统计分析. 本文简单介绍下一个使用saiku去查询分析hbase数据的例子. 1.phoenix和h ...

  9. jquery学习笔记1

    (1) jQuery的Id选择器: $("#btnShow") (2) 事件绑定函数 bind() $("#btnAdd").bind("click& ...

  10. Java基础:多线程

    基本概念 程序&线程&进程 程序是一个段可以提供业务功能的代码,它可以包含1个或多个进程.程序在OS上运行时表现为进程对各种资源(CPU,内存,Disk..)的消耗和处理. 进程是OS ...