来源:点击打开链接
一道找规律题。这个题的主要目的是为了寻找一个映射和标号之间的对应关系,即给出下标,获得映射,或者给出映射,得到下标。
不难看出,映射是有规律的,根据题意可以推出:
(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; }