Fengshui-[SZU_B40]
Description
Fengshui is an ancient subject in Chinese tradition. Someone considers it as science and someone criticizes it as blind faith. Who knows! However, in modern days, everyone should respect culture from our ancestor!
Fengshui focus on geography,environment and staffs' position, all the theory come from a very old book named "YI". YI means change. Everything is always changing in the world. Fengshui wishes to guide changing, make life change to a better situation. Now let's look at Fengshui's changing.
At first we must know about the traditional five elements system which composed by GOLD,WOOD,GROUND,WATER and FIRE. Everything in the world can be represented by one and only one element. For example, river is represented by WATER, hill is represented by GROUND. Here, we only consider the elements. In this system, once element can kill another element, and one element can born anther element. Five elements compose as a circuit, as in Figure 1.
Every place has eight direction - east, west, north, south, northeast, northwest, southeast and southwest. Every direction has a represented element. Now, our problem is about the elements at these eight directions which form a Fengshui situation. Figure 2 is an example of one Fengshui situation.
But Fengshui situation can change! There're two change ways:
TURN: The whole situation turn clockwise one step. Figure 3 shows the situation that situation in Figure 2 makes one TURN change.
REBORN: Based on kill and born relation, one direction's element can be killed by another direction's (at any other place) element in the situation, and then the killed element will born out as the new element at its direction. Of course, kill and born are all according as the relation of the system as in Figure 1. In situation of Figure 3, WATER in east can kill FIRE in southeast, then southeast place change to be GROUND, as in Figure 4.
Each change, no matter TURN or REBORN, const one step.
Now, there're two Fengshui situation, we want to know is it possible that first one can change to the second one? And if possible, how many steps it need at least?
Input
There're several cases, the first line of input is the number of cases. Every case includes 6 lines, the first 3 lines indeicate the first Fengshui situation, the last 3 lines incicate the second Fengshui situation.
The format of one situation is as follow, there may be arbitrary blanks between adjacent directions.
northwest north northeast
west east
southwest south southeast
Output
For every case, output the number of the least changing steps on a single line, if it is possible, or output -1.
Sample Input
2
GOLD WOOD WATER
WATER FIRE
WOOD GOLD GROUND
WATER GOLD WOOD
WOOD WATER
GOLD GROUND GROUND
WATER GROUND WOOD
GOLD FIRE
GOLD FIRE GROUND
GOLD FIRE FIRE
GOLD FIRE
WATER GROUND WOOD
Sample Output
2
14
This problem seems like a kind of for beginners.The time limit is up to 30 seconds.Or maybe it wasn't in the competition where it from.So beginners like me can pass this question through the most simple search.
The second operate reborn means for a element in some direction,if there exist a element which is also one of the eight directions and can kill it ,it can execute the reborn operate.
/*Gold 0
Wood 1
Water 2
Fire 3
Ground 4*/
/*
012
7 3
654
01234567
701
6 2
543
70123456
*/
#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
struct node
{
int num,step;
};
const int pow5[10]={1,5,25,125,625,3125,15625,78125,390625,1953125};
const int kill[5] ={1,4,3,0,2};
const int born[5] ={2,3,1,4,0};
bool f[500000];
int map[8],S,T;
int bfs()
{
int i,j,k;
memset(f,0,sizeof(f));
f[S]=true;
queue<node> q;
while (!q.empty()) q.pop();
node tmp;
tmp.num=S;
tmp.step=0;
q.push(tmp);
while (!q.empty())
{
node x=q.front();
q.pop();
if (x.num==T) return x.step;
tmp=x;
tmp.step++;
int fr=tmp.num%5;
tmp.num=(tmp.num/5)+fr*pow5[7];
if (!f[tmp.num])
{
f[tmp.num]=true;
q.push(tmp);
}
tmp.num=x.num;
for (i=7;i>=0;i--)
{
map[i]=tmp.num%5;
tmp.num/=5;
}
for (i=0;i<8;i++)
{
bool flag=false;
for (j=0;j<8;j++)
if (kill[map[j]]==map[i])
{
int tt=map[i];
map[i]=born[map[i]];
tmp.num=0;
for (k=0;k<8;k++)
tmp.num=tmp.num*5+map[k];
if (!f[tmp.num])
{
f[tmp.num]=true;
q.push(tmp);
}
map[i]=tt;
break;
}
}
}
return -1;
}
int main()
{
int C,i;
scanf("%d",&C);
char s[8][15],t[8][15];
while (C--)
{
scanf("%s%s%s%s%s%s%s%s",s[0],s[1],s[2],s[7],s[3],s[6],s[5],s[4]);
scanf("%s%s%s%s%s%s%s%s",t[0],t[1],t[2],t[7],t[3],t[6],t[5],t[4]);
S=0,T=0;
for (i=0;i<8;i++)
{
if (s[i][0]=='G' && s[i][1]=='O') S=S*5+0;
if (s[i][0]=='W' && s[i][1]=='O') S=S*5+1;
if (s[i][0]=='W' && s[i][1]=='A') S=S*5+2;
if (s[i][0]=='F' && s[i][1]=='I') S=S*5+3;
if (s[i][0]=='G' && s[i][1]=='R') S=S*5+4;
}
for (i=0;i<8;i++)
{
if (t[i][0]=='G' && t[i][1]=='O') T=T*5+0;
if (t[i][0]=='W' && t[i][1]=='O') T=T*5+1;
if (t[i][0]=='W' && t[i][1]=='A') T=T*5+2;
if (t[i][0]=='F' && t[i][1]=='I') T=T*5+3;
if (t[i][0]=='G' && t[i][1]=='R') T=T*5+4;
}
printf("%d\n",bfs());
}
return 0;
}
Fengshui-[SZU_B40]的更多相关文章
- CVE-2015-7645 analyze and exploit
Hack team之后adobe和google合作对flash进行了大改,一度提高了flash的利用门槛,CVE-2015-7645作为第一个突破这些限制的漏洞利用方式,可以作为vetect利用方式之 ...
- [2014-09-21]如何在 Asp.net Mvc 开发过程中更好的使用Enum
场景描述 在web开发过程中,有时候需要根据Enum类型生成下拉菜单: 有时候在输出枚举类型的时候,又希望输出对应的更具描述性的字符串. 喜欢直接用中文的请无视本文 不多说,直接看代码. 以下代码借鉴 ...
- [web]2019第一起数据泄露事件
-rwxrwxrwx 33405108 Jan 22 2016 000webhost.txt -rwxrwxrwx 165025 Jul 29 2017 01nii.ru {1.931} [HASH] ...
- webug4.0 打靶笔记-02【完结】
webug4.0打靶笔记-02 3. 延时注入(时间盲注) 3.1 访问靶场 3.2 寻找注入点 貌似一样的注入点: ?id=1' --+ 3.3 判断输出位置 同前两关一样的位置,时间盲注应该不是这 ...
随机推荐
- IOS8修改状态栏颜色
IOS8修改状态栏颜色 http://blog.csdn.net/suelu/article/details/43701913 使用了storyboard,直接view controller里面设置s ...
- WPF 路由事件总结
1.什么是路由事件 已下为MSDN中的定义 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件. 实现定义:路由事件是一个 CLR 事件,可以由 R ...
- [flag飞起]
重度Flag: Rush 未来程序・改 (note: 由于代码存放地址原因(物理)无法本周完成) 轻度Flag: 未来程序・改写完后刷QTREE与主席树 严重Flag: 计算几何...
- Java和Python运行速度对比
Java和Python运行速度对比:同一个函数运行一百万次,Java耗时0.577秒,Python耗时78秒--135倍的差距. 版本:Java 8,Python 2.7.10 Java测试代码: i ...
- Android Debugging
Debugging methods for Android Contents [hide] 1 Debuggers 1.1 Kernel and User co-debug with GDB on ...
- JQuery $.ajax()方法详解
jQuery Ajax 参考手册 实例 通过 AJAX 加载一段文本: jQuery 代码: $(document).ready(function(){ $("#b01").cli ...
- 《转载》三年建站之路走得一事无成 今来A5撞墙反思
本文转载自A5站的蚕丝被.如果给站长带来不便之处,请联系博主. 时间过得真快,记得上一次在A5写文章已经是一年前的事了,这其中是有原因的,今天就跟大家来聊聊三年来个人失败经历的撞墙反思,也给一些有着同 ...
- EtherCAT数据帧结构
EtherCAT数据直接使用以太网数据帧(以太网帧解释http://blog.chinaunix.net/uid-23080322-id-118440.html)传输,使用的帧类型为0x88A4.Et ...
- Windows命令行重命名文件
RENAME D:\Cache\xyz.html xyz%date:~0,4%%date:~5,2%%date:~8,2%.tar.gz
- 【读书笔记】读《JavaScript设计模式》之装饰者模式
一.定义 装饰者模式可用来透明地把对象包装在具有同样接口的另一个对象之中.这样一来,你可以给一个方法添加一些行为,然后将方法调用传递给原始对象.相对于创建子类来说,使用装饰者对象是一种更灵活的选择(装 ...