• 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
    ",bfs());
    	}
    	return 0;
    }
    

     

  • 相关阅读:
    theme-windowAnimationStyle 动画设置
    Perl中的正则表达式
    repo sync下载脚本
    Virtual Box创建共享目录
    ubuntu下安装jdk
    adb logcat 命令
    如何提高上传带宽
    Ubuntu安装dos2unix工具
    Android打Path的方法
    Ubuntu快捷键
  • 原文地址:https://www.cnblogs.com/dramstadt/p/3226402.html
Copyright © 2020-2023  润新知