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 判断输出位置 同前两关一样的位置,时间盲注应该不是这 ...
随机推荐
- quaternion*Vector3的新理解
原地址:http://www.cnblogs.com/88999660/p/3262656.html using UnityEngine; using System.Collections; publ ...
- notepad正则表达式
文件名称匹配 文件名称: boost_chrono-vc100-mt-1_49.dll 对应的notepad正则表达式: \w*_\w*-\w*-\w*-\w*-\w*.dll 移除空行 查找目标: ...
- PHP无限极分类实现
简单版的PHP生成无限极分类代码.其中包括了数据库设计.以及输出分类HTML代码. SQL代码 CREATE TABLE `district` ( `id` int(10) unsigned NOT ...
- OJ 1188 全排列---康托展开
题目描述 求n的从小到大第m个全排列(n≤20). 输入 n和m 输出 输出第m个全排列,两个数之间有一空格. 样例输入 3 2 样例输出 1 3 2 #include<cstdio> # ...
- 【GoLang】GoLang fmt 占位符详解
golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. # 定义示例类型和变量 type Human struct { Name string } var peo ...
- Timer1控件的属性
- PYTHON实现HTTP基本认证(BASIC AUTHENTICATION)
参考: http://www.voidspace.org.uk/python/articles/authentication.shtml#id20 http://zh.wikipedia.org/wi ...
- 45. Singleton类的C++/C#实现[Singleton]
[题目] 设计一个类,我们只能生成该类的一个实例. [分析] 单例模式的意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点.让类自身负责保存它的唯一实例.这个类可以保证没有其他实例可.以被创建 ...
- mysqldump备份
备份工具1.mysqldump(数据量很大时不推荐使用) myisam 锁表 innodb 行锁 mysqldump --help | less #查看mysql所有的语法 mysqldu ...
- Java for LeetCode 200 Number of Islands
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...