您的位置:首页 > 编程语言 > Go语言

【打表找规律】2013寒假SD高校ACM周赛5——I’ve Got Your Back(gammon)

2013-01-31 14:20 507 查看
来源:点击打开链接

一道找规律题。这个题的主要目的是为了寻找一个映射和标号之间的对应关系,即给出下标,获得映射,或者给出映射,得到下标。

不难看出,映射是有规律的,根据题意可以推出:

(0,0,0,0,0,15)(开始)

(0, 0, 0, 0, 1, 14),

(0, 0, 0, 0, 2, 13), ...

(0,0,0,0,3,12)...

(0, 0, 0, 0, 14, 1),

(0, 0, 0, 0, 15, 0),

(0, 0, 0, 1, 0, 14),

(0, 0, 0, 1, 1, 13)....直到(15,0,0,0,0,0),比较好找,它们的和都是15。

直接打表即可。

#include <string>
#include <iostream>
#include <map>
using namespace std;

class tas
{
	public:
		int p[6];
};

tas tarsign[17000];

void initarr()   //找到规律建表 
{	
	int count=0; //第几个 
	for(int i=0;i<=15;i++)    //关键:这些映射的和总是为15 
	{
		for(int j=0;j<=15-i;j++)  //依序从后往前寻找 
		{
			for(int k=0;k<=15-i-j;k++)
			{
				for(int l=0;l<=15-i-j-k;l++)
				{
					for(int m=0;m<=15-i-j-k-l;m++)
					{
						tarsign[count].p[0]=i;
						tarsign[count].p[1]=j;
						tarsign[count].p[2]=k;
						tarsign[count].p[3]=l;
						tarsign[count].p[4]=m;
						tarsign[count].p[5]=15-i-j-k-l-m;
						count++;
					}
				}
			}
		}
	}
}

int main()
{
	initarr();
	string opper;
	int outpos=1;
	while(cin>>opper)
	{
		
		if(opper=="e")
		{
			break;
		}
		
		else if(opper=="m") //从映射找序号 
		{
			int ts[6];
			cin>>ts[0]>>ts[1]>>ts[2]>>ts[3]>>ts[4]>>ts[5];
			
			int start=0;   //开始的首位置 
			for(int i=0;i<=5;i++)
			{
				while(tarsign[start].p[i]!=ts[i])
					start++;
			}
			cout<<"Case "<<outpos<<": ";
			cout<<start<<endl;
			outpos++;
		}
		else if(opper=="u")
		{
			int needquery;
			cin>>needquery;
			cout<<"Case "<<outpos<<": ";
			cout<<tarsign[needquery].p[0]<<" "<<tarsign[needquery].p[1]<<" "<<tarsign[needquery].p[2]<<" "<<tarsign[needquery].p[3]<<" "<<tarsign[needquery].p[4]<<" "<<tarsign[needquery].p[5]<<endl;
			outpos++;
		} 
	}
	
	return 0;	
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: