PKU Online Judge 1054:Cube (设置根节点)
1054:Cube
总时间限制:
1000ms
内存限制:
131072kB
- 描述
-
Delayyy君很喜欢玩某个由Picks编写的方块游戏,游戏在一个由单位格组成的棋盘上进行。
游戏的主角是一个6个面互不相同的小方块,每次可以向上下左右中的某个方向翻滚一格。
棋盘上有 N 个关键格子,对应于游戏中的村庄,在坐标系中,每个村庄有一个坐标位置 (x,y) (任意两个村庄位置不相等)。先前的方块村民已经修好了 N-1 条道路(高架桥、地下隧道等,即不能从一条道路走上另一条道路)使这 N 个村庄连通,并且由于方块民族的习俗,每条道路都平行于坐标轴。
主角小方块打算选两个村庄 S 、 T ,沿最短路进行一次 S 到 T 的旅行。
但由于方块民族的特殊属性,小方块一次旅行终止时必须和开始时的状态(即六个面的朝向)完全一致。
Delayyy君想知道,从每个村庄出发,主角小方块能选出多少个可行的旅行终点。
数据范围
- 输入
-
一个测试点中有多组数据(不超过10组)。对于每组数据:
第一行一个整数:N。
接下来 N 行中的第 i 行中有两个整数:x[i], y[i],表示第 i 个关键格子(即村庄)的位置。
再接着 N-1 行,每行两个数:u, v,表示第 u 个关键格子和第 v 个关键格子之间有边。保证 x[u]=x[v] 或 y[u]=y[v]。
- 输出
-
对于每组数据:
输出共 N 行。
第 i 行表示从第 i 个关键格子开始滚动符合要求的方案数。
- 样例输入
-
1
1 1
3
1 1
1 2
5 1
1 2
1 3 - 样例输出
-
0
1
0
1 - 提示
对于第二个样例,仅有在1,3号关键格子中滚动时不会改变状态。
思路:
如果求任意两点间是否能到达的话,那枚举两个点就是O(n*n)了,要超时了。所以想到设置一个根节点,一遍dfs就能求出根节点到其他点的状态,那么如果到达两个点的状态相同的话,就知道这两个点能相互到达了,因为p1->p2 = p1->根->p2。状态的话将cube编号,存上、前、右三个面的值就够了(两个也可以,但是滚动时没有三个方便)。
ps:一个点到一个点状态是否变化不能简单的用x之差与y之差%4==0来简单判断.
顺便说一下那个其实不需要将状态编号的,我的代码多余了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 100005
#define MAXN 20005
#define mod 1000000007
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 0.000001
typedef long long ll;
using namespace std; int n,m,ans;
int px[maxn],py[maxn];
vector<int>edge[maxn];
bool vis[maxn];
int mp[7][7][7],num[50]; // mp-状态对应的编号 num-每个状态的个数
int s[maxn]; //s-每个点对应的状态
int obj[7]={0,6,5,4,3,2,1}; // 每个点的对立面 void dfs(int u,int x,int y,int z)
{
int i,j,t,tx,ty,tz,v,w;
s[u]=mp[x][y][z];
num[s[u]]++;
for(i=0;i<edge[u].size();i++)
{
v=edge[u][i];
if(!vis[v])
{
vis[v]=1;
if(px[v]==px[u])
{
if(py[v]>py[u]) // 上
{
w=py[v]-py[u];
w=w%4;
tx=x,ty=y;
for(j=1;j<=w;j++)
{
t=tx;
tx=ty;
ty=obj[t];
}
dfs(v,tx,ty,z);
}
else // 下
{
w=py[u]-py[v];
w=w%4;
tx=x,ty=y;
for(j=1;j<=w;j++)
{
t=tx;
tx=obj[ty];
ty=t;
}
dfs(v,tx,ty,z);
}
}
else
{
if(px[u]>px[v]) // 左
{
w=px[u]-px[v];
w=w%4;
tx=x,ty=y,tz=z;
for(j=1;j<=w;j++)
{
t=tx;
tx=tz;
tz=obj[t];
}
dfs(v,tx,ty,tz);
}
else // 右
{
w=px[v]-px[u];
w=w%4;
tx=x,ty=y,tz=z;
for(j=1;j<=w;j++)
{
t=tx;
tx=obj[tz];
tz=t;
}
dfs(v,tx,ty,tz);
}
}
}
}
}
int main()
{
int i,j,u,v;
memset(mp,0,sizeof(mp));
mp[1][2][4]=1,mp[1][3][2]=2,mp[1][4][5]=3,mp[1][5][3]=4; // 将状态编号
mp[2][1][3]=5,mp[2][3][6]=6,mp[2][6][4]=7,mp[2][4][1]=8;
mp[3][1][5]=9,mp[3][5][6]=10,mp[3][6][2]=11,mp[3][2][1]=12;
mp[4][2][6]=13,mp[4][6][5]=14,mp[4][5][1]=15,mp[4][1][2]=16;
mp[5][1][4]=17,mp[5][4][6]=18,mp[5][6][3]=19,mp[5][3][1]=20;
mp[6][2][3]=21,mp[6][3][5]=22,mp[6][5][4]=23,mp[6][4][2]=24;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
{
scanf("%d%d",&px[i],&py[i]);
edge[i].clear();
}
for(i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis));
vis[1]=1;
dfs(1,1,2,4);
for(i=1;i<=n;i++)
{
printf("%d\n",num[s[i]]-1);
}
}
return 0;
}
PKU Online Judge 1054:Cube (设置根节点)的更多相关文章
- xml文件的根节点layout_width或者layout_height设置无效果的原因分析
在android开发中相信大家对ListView.GridView等组建都非常熟悉,在使用它们的时候须要自己配置相关的Adapter,而且配置现骨干的xml文件作为ListView等组建的子View, ...
- jsTree展开根节点 设置用户图标
$("#jstree").on("loaded.jstree", function (event, data) { var n = 0; var root = ...
- C#中treeview的问题,如何区分根节点和子节点以及根节点和根节点的兄弟节点?
根节点的Level属性为0,一级子节点Level属性为1,二级子节点Level属性为2,以此类推:同级节点可以用索引.名称.文本来区分.用索引区分根节点时,TreeView.Nodes[0]就是第一个 ...
- unity, 在保持场景根节点Transform不变且Hierarchy结构不变的前提下整体旋转场景
比如我们摆出下面结构: 其Hierarchy如下: 其中根节点road的Transform是如下干净的原始状态: 现在想保持road的Hierarchy和Transform都不变的情况下将road旋转 ...
- 我眼中的Linux设备树(五 根节点)
五 根节点一个最简单的设备树必须包含根节点,cpus节点,memory节点.根节点的名字及全路径都是"/",至少需要包含model和compatible两个属性.model属性我们 ...
- Linux设备树(五 根节点)
五 根节点 一个最简单的设备树必须包含根节点,cpus节点,memory节点.根节点的名字及全路径都是“/”,至少需要包含model和compatible两个属性.model属性我们在属性那节已经说过 ...
- js动态设置根元素的rem方案
方案需求: rem 单位在做移动端的h5开发的时候是最经常使用的单位.为解决自适应的问题,我们需要动态的给文档的根节点添加font-size 值. 使用mediaquery 可以解决这个问题,但是每一 ...
- ztree实现根节点右击事件,显示添加删除
需求,右击树节点,出现编辑和删除的提示框 1:在setting 配置里面,给callback设置,右击事件onRightClick: 2:写一个函数onRightClick function onRi ...
- ztree实现根节点单击事件,显示节点信息
这段时间在维护公司的项目,去年做的项目里面有ztree树的例子,想起之前还没有开始写博客,一些知识点也无从找起,要新加一个右击节点事件,折腾了半天,其中也包含了一些知识点,稍稍做了一些demo. zT ...
随机推荐
- c语言关键字总结
1.关键字变更历史 1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字: inline restrict _Bool _Complex _Imaginary(注意bool 从 ...
- javascript六难题
1.下面代码的运行效果是什么?为什么? <html> <head> <meta charset="utf-8"> <title>DO ...
- MSP430看门狗
其实430的看门狗,与51的大同小异,都是为了防止程序跑飞而出现不可预知的错误而专门设定的,所以说,看门狗的应用,是项目马上要进行实际应用中必须要进行的一环,也是电子工程师必须掌握的一环,下面介绍一下 ...
- wuzhicms 模块开发
首先,模块开发需要了解五指cms的目录结构: 然后,我们需要新增加一个模块目录: 再app下面创建 如:content 下面包含文件: 前台文件的创建: 看下 index.php 的内容: <? ...
- 了解常见的 Azure 灾难
以下内容涵盖多种不同类型的灾难情况.数据中心故障不是应用程序范围内发生故障的唯一原因.设计不良或管理错误也会导致中断.请在恢复计划的设计和测试阶段设想可能导致故障的原因,这样做很重要.一个好的计划可充 ...
- 部分常用Express方法详解
app.set(name, value) 分配给name一个value,并将name作为app settings table的一个属性. 使用app.set('foo', true) 相当于调用 ap ...
- 【noip2012】疫情控制
题意: 给出一颗n个节点有边权的树 和m个军队所在的位置 军队从某节点移动到相邻节点要花费边长度的时间 求最少要多少时间使得根节点(编号为1)到每个叶子的路径上最少有一支军队(根节点不能有军队) 题解 ...
- BNUOJ-26580 Software Bugs KMP匹配,维护
题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26580 题意:给一个模式串,然后m个匹配串,要求删掉匹配串中的所有存在的模式串,使得余下的 ...
- 基于memcached的单机轻量级通用缓存库minicached的实现
一.前言 之前拜读过淘宝子柳的<淘宝技术这十年>之大作,深知缓存技术在系统优化中起着一个举足轻重的作用.无论是文件系统静态文件,数据库的访问,乃至网络数据的请求,只要是与内存访问速度相差较 ...
- decorview that was originally added here or java.lang.IllegalArgumentException: View not attached to window manager
使用Dialog的时候,没少出现下面这两个报错 12-11 17:47:49.776: E/WindowManager(11461): android.view.WindowLeaked: Activ ...