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 判断输出位置 同前两关一样的位置,时间盲注应该不是这 ...
随机推荐
- [Effective JavaScript 笔记]第60条:支持方法链
无状态的API的部分能力是将复杂操作分解为更小的操作的灵活性.一个很好的例子是字符串的replace方法.由于结果本身也是字符串,可以对前一个replace操作重复执行替换.这种模式的一个常见用例是在 ...
- select function in ruby
http://ruby-doc.org/ http://ruby-doc.org/core-2.3.0/Array.html#method-i-select [1,2,3,4,5].select { ...
- [ruby on rails] 跟我学之(1)环境搭建
环境: ubuntu 12.04 (64bit) 代理: 自己最好弄一个代理. 环境配置指令如下: sudo apt-get update sudo apt-get install curl \cur ...
- javascript的事件监听与捕获和冒泡
在前端开发中,我们经常需要对某些事件进行监听.这样只要在指定的元素上触发了该事件,就会执行一个回调来进行相关的操作. 而js中事件监听方法总共有三种,分别如下所示: element.addEventL ...
- 【转】SQL删除重复记录,只保留其中一条
SQL:删除重复数据,只保留一条用SQL语句,删除掉重复项只保留一条在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peop ...
- jQuery ajax跨域请求的解决方法
在Ajax应用中,jQuery的Ajax请求是非常容易而且方便的,但是初学者经常会犯一个错误,那就是Ajax请求的url不是本地或者同一个服务器下面的URI,最后导致虽然请求200,但是不会返回任何数 ...
- Delphi经验总结(1)
先人的DELPHI基础开发技巧 ◇[DELPHI]网络邻居复制文件 uses shellapi; copyfile(pchar('newfile.txt'),pchar('//computername ...
- MPlayer 增加边看边剪切功能
下载 http://pan.baidu.com/s/1ntj0XLn 解压到 D:\MPlayer 前些日子用 FFMpeg 的 FFPlay 来做了视频剪切工具 结果发现 FFPlay 的 CPU ...
- Maven简介
转载地址:http://www.cnblogs.com/itech/archive/2011/11/01/2231837.html Ant是软件构建工具,Maven的定位是软件项目管理和理解工具.Ma ...
- 矩形覆盖(codevs 1101)
题目描述 Description 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4 ...