来源:点击打开链接
一道找规律题。这个题的主要目的是为了寻找一个映射和标号之间的对应关系,即给出下标,获得映射,或者给出映射,得到下标。
不难看出,映射是有规律的,根据题意可以推出:
(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;
}
本文介绍了一种通过编程解决找规律问题的方法。该方法利用C++实现了一个映射表,能够根据给定的条件快速找到对应的序列或其位置。通过遍历所有可能的组合并存储在映射表中,使得查询变得十分高效。

被折叠的 条评论
为什么被折叠?



