现在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. maven核心概念4

    一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识(包名) artifactId:项目名称 ver ...

  2. keepalived的安装和使用

    IP配置 管理IP地址 角色 备注 网卡 192.168.1.114 主调度器(Director) 对外提供VIP服务的地址为192.168.1.88 eth1 192.168.1.205 备用调度器 ...

  3. python的最最最最最基本语法(2)

    函数的定义: 使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 当用return 返回多个值时,返回的其实是一个tuple, ...

  4. Android开发面试经——5.常见面试官提问Android题①

    版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客: http://blog.csdn.net/f ...

  5. Android软键盘弹出时把布局顶上去的解决方法

    原文: 解决Andriod软键盘出现把原来的布局给顶上去的方法(转) 链接:http://blog.sina.com.cn/s/blog_9564cb6e0101g2eb.html 决方法,在main ...

  6. python 打包与部署

    环境:win10.eclipse-jee-mars.python2.7 打包在linux上进行安装测试 1.1 打包 项目目录结构如下: 打包对象:utils.reg 在P1项目的顶级目录,也就是ut ...

  7. 20160805_笔记本_CentOS6.4x64分区

    1.严gong 笔记本 CentOS6.4x64分区: 1.1.OS自动分区的方案: 1.2.我模仿上面的方案,自己弄的方案:(没有LVM卷组) 2.

  8. hdu_3555 bomb

    数位动态规划     数位动态规划是求解一个大区间[L, R]中间满足条件Q的所有数字的个数(或者和,或其他)的一种方法.它通过分析每一位上的数字,一般用 dp[len][digit][...] 来表 ...

  9. wifi adb 调试手机

    首先手机,PC都连上WIFI, 如果可以用USB操作,在PC端,输入ping 手机的ip 地址,看看是否成功, 在PC端输入下面命令adb tcpip 5555adb connect 192.168. ...

  10. XP系统电脑带安卓手机上网教程(无需adhoc补丁)

    XP系统电脑带安卓手机上网教程(无需adhoc补丁) WIN7系统可以虚拟wifi热点,安卓手机连上这个热点就能上网.XP系统虚拟出来的wifi热点是adhoc形式的,原生的安卓系统并不支持adhoc ...