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

来源:互联网 发布:网上卖东西的软件 编辑:程序博客网 时间:2024/05/17 00:14

来源:点击打开链接

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

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

(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;}



原创粉丝点击