四阶幻方

我写的四阶幻方出来了,运行结果正确,7040个的版本。虽然好像还有些问题,不过算了,能跑就可以了,呵呵。
不要输出的话我的p4 3.2G上耗时5s,算还过得去吧 ^_^
以下是程序:
cpp 代码
 
#include <iostream></iostream> #include <time.h></time.h>
using namespace std;      struct uni   {       int a,b,c,d;   };      uni can[2065];   long sum = 0;   int sum_all = 0;      void get_all_num()   {       for(int i = 1;i <= 16;++i)       {           for(int j = 1;j <= 16;++j)           {               for(int k = 1; k <= 16; ++k)               {                   for(int l = 1;l <= 16;++l)                   {                                      if(i != j && i != k && i != l && j != k && j != l && k != l)                           if(i + j + k + l == 34)                           {                               can[sum].a = i;                               can[sum].b = j;                               can[sum].c = k;                               can[sum].d = l;                               ++sum;                           }                   }               }           }       }   }      void p_rint(const int sq[])   {       cout << "i wIll gIvE yOu sOme coLoR 2CC! " << sum_all <     cout << sq[0] << " " << sq[1] << " " << sq[2] << " " << sq[3] << endl;       cout << sq[4] << " " << sq[5] << " " << sq[6] << " " << sq[7] << endl;       cout << sq[8] << " " << sq[9] << " " << sq[10] << " " << sq[11] << endl;       cout << sq[12] << " " << sq[13] << " " << sq[14] << " " << sq[15] << endl << endl;   }      inline bool caca(const int sq[])   {       if(sq[0] + sq[4] + sq[8] + sq[12] !=34)           return false;       if(sq[2] + sq[6] + sq[10] + sq[14] !=34)           return false;       return true;   }      inline bool detec_2(const int sq[])   {       int km2[17];       int i,m;       for(i = 0;i < 16;++i)       {           km2[i] = 0;       }          for(m = 0;m < 16;++m)       {           km2[sq[m]]++;           if(km2[sq[m]] > 1)               return false;       }          return true;   }   inline bool detec_1(const int c1[],const int c2[])   {       int km2[17];       for(int i = 0;i < 16;++i)       {           km2[i] = 0;       }          km2[c1[0] - 1]++;       km2[c1[1] - 1]++;       km2[c1[2] - 1]++;       km2[c1[3] - 1]++;              km2[c2[0] - 1]++;       km2[c2[1] - 1]++;       km2[c2[2] - 1]++;       km2[c2[3] - 1]++;          for(i = 0;i < 16;i++)       {           if(km2[i] > 1)               return false;       }          return true;   }      void fill_in_line(int c1[],int c2[])   {       int sq[16];          sq[0] = c1[0];       sq[5] = c1[1];       sq[10] = c1[2];       sq[15] = c1[3];          sq[3] = c2[0];       sq[6] = c2[1];       sq[9] = c2[2];       sq[12] = c2[3];                   for(int k = 1;k <= 16;k++)       {           sq[4] = k;                      for(int l = 1;l <= 16;++l)           {               sq[1] = l;                                  sq[7] = 34 - sq[4] - sq[5] - sq[6];               sq[11] = 34 - sq[3] - sq[7] - sq[15];               sq[8] = 34 - sq[9] - sq[10] - sq[11];               sq[13] = 34 - sq[1] - sq[5] - sq[9];               sq[14] = 34 - sq[12] - sq[13] - sq[15];               sq[2] = 34 - sq[0] - sq[1] - sq[3];                          if(sq[7] > 0 && sq[11] > 0 && sq[8] > 0 && sq[13] > 0 && sq[14] > 0 && sq[2] > 0)                   if(sq[7] <= 16 && sq[11] <= 16 && sq[8] <= 16 && sq[13] <= 16 && sq[14] <= 16 && sq[2] <= 16)                       if(detec_2(sq) && caca(sq))                       {                           sum_all++;                           p_rint(sq);                       }           }       }      }   void fill_in_eight()   {       int cse1[4],cse2[4];          for(int i = 0;i < sum;++i)       {           for(int j = 0;j < sum;++j)           {               if( i!=j )               {                   cse1[0] = can[i].a;                   cse1[1] = can[i].b;                   cse1[2] = can[i].c;                   cse1[3] = can[i].d;                      cse2[0] = can[j].a;                   cse2[1] = can[j].b;                   cse2[2] = can[j].c;                   cse2[3] = can[j].d;                                      if(detec_1(cse1,cse2))                   {                       fill_in_line(cse1,cse2);                   }               }                          }       }   }      int main()   {       time_t t;       t = clock();          get_all_num();       fill_in_eight();          cout << "time consumed: " << clock() - t << " ms"<< endl;       cin.get();       return 0;   }  

写得比较烂,咳咳咳


找个时间,来个ruby版的。
ps:最近发现牛人们都很臭屁,臭不可闻啊,唉,风气啊风气。做技术的人都很臭屁,果然啊果然,但愿我以后不会这样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值