16宫格全解高效算法
2010-03-26 17:37
148 查看
#include <iostream> #include <afx.h> using namespace std; int g_a[16] = {0}; BOOL IfEqual(int element, int n) { for (int i=0; i<n; i++) { if (g_a[i]==element) { return TRUE; } } return FALSE; } void main(void) { DWORD dwTick = ::GetTickCount(); int a[86][4] = {0}; int i1 = 0; int i2 = 0; int i3 = 0; int i4 = 0; int nCount1 = 0; CFile file; CString str = _T(""); CString strLine = _T(""); for (i1=16; i1>9; i1--) { for (i2=i1-1; i2>6; i2--) { for (i3=i2-1; i3>1; i3--) { if ((i1+i2+i3)>=34) continue; i4=34-i3-i2-i1; if (i4<1 || i4>=i3) continue; a[nCount1][0] = i1; a[nCount1][1] = i2; a[nCount1][2] = i3; a[nCount1][3] = i4; // cout<<a[nCount][0]<<" "<<a[nCount][1]<<" "<<a[nCount][2]<<" "<<a[nCount][3]<<endl; strLine.Format(_T("%d %d %d %d/r/n"), a[nCount1][0], a[nCount1][1], a[nCount1][2], a[nCount1][3]); str += strLine; nCount1++; } } } int l1 = 0; int l2 = 0; int l3 = 0; int l4 = 0; int elem = 0; BOOL exist = FALSE; int nGroup[2352][4][4] = {0}; int nCount = 0; for (l1=0; l1<19; l1++) { g_a[0] = a[l1][0]; g_a[1] = a[l1][1]; g_a[2] = a[l1][2]; g_a[3] = a[l1][3]; for (l2=19; l2<86; l2++) { for (elem=0; elem<4; elem++) { if (IfEqual(a[l2][elem], 4)) { exist = TRUE; break; } } if (exist) { exist = FALSE; continue; } if (a[l2][0]>=a[l1][0]) { continue; } g_a[4] = a[l2][0]; g_a[5] = a[l2][1]; g_a[6] = a[l2][2]; g_a[7] = a[l2][3]; for (l3=19; l3<86; l3++) { for (elem=0; elem<4; elem++) { if (IfEqual(a[l3][elem], 8)) { exist = TRUE; break; } } if (exist) { exist = FALSE; continue; } if (a[l3][0]>=a[l2][0]) { continue; } g_a[8] = a[l3][0]; g_a[9] = a[l3][1]; g_a[10] = a[l3][2]; g_a[11] = a[l3][3]; for (l4=19; l4<86; l4++) { for (elem=0; elem<4; elem++) { if (IfEqual(a[l4][elem], 12)) { exist = TRUE; break; } } if (exist) { exist = FALSE; continue; } if (a[l4][0]>=a[l3][0]) { continue; } g_a[12] = a[l4][0]; g_a[13] = a[l4][1]; g_a[14] = a[l4][2]; g_a[15] = a[l4][3]; nGroup[nCount][0][0] = g_a[0]; nGroup[nCount][0][1] = g_a[1]; nGroup[nCount][0][2] = g_a[2]; nGroup[nCount][0][3] = g_a[3]; nGroup[nCount][1][0] = g_a[4]; nGroup[nCount][1][1] = g_a[5]; nGroup[nCount][1][2] = g_a[6]; nGroup[nCount][1][3] = g_a[7]; nGroup[nCount][2][0] = g_a[8]; nGroup[nCount][2][1] = g_a[9]; nGroup[nCount][2][2] = g_a[10]; nGroup[nCount][2][3] = g_a[11]; nGroup[nCount][3][0] = g_a[12]; nGroup[nCount][3][1] = g_a[13]; nGroup[nCount][3][2] = g_a[14]; nGroup[nCount][3][3] = g_a[15]; nCount++; } } } } // cout<<nCount<<endl; int h1 = 0, h2 = 0, h3 = 0, h4 = 0; int v[16] ={0}; int nTeam = 0; int total = 0; int b[16]; for (nTeam=0; nTeam<nCount; nTeam++) { for (h1=0; h1<4; h1++) { for (h2=0; h2<4; h2++) { if (h2==h1) continue; for (h3=0; h3<4; h3++) { if (h3==h1 || h3==h2) continue; for (h4=0; h4<4; h4++) { if (h4==h1 || h4==h2 || h4==h3) continue; /************************************************************************/ for (v[0]=0; v[0]<4; v[0]++) { for (v[1]=0; v[1]<4; v[1]++) { if (v[1]==v[0]) continue; for (v[2]=0; v[2]<4; v[2]++) { if (v[2]==v[0] || v[2]==v[1]) continue; for (v[3]=0; v[3]<4; v[3]++) { if (v[3]==v[0] || v[3]==v[1] || v[3]==v[2]) continue; b[0] = nGroup[nTeam][h1][v[0]]; b[1] = nGroup[nTeam][h1][v[1]]; b[2] = nGroup[nTeam][h1][v[2]]; b[3] = nGroup[nTeam][h1][v[3]]; /************************************************************************/ for (v[4]=0; v[4]<4; v[4]++) { for (v[5]=0; v[5]<4; v[5]++) { if (v[5]==v[4]) continue; for (v[6]=0; v[6]<4; v[6]++) { if (v[6]==v[4] || v[6]==v[5]) continue; for (v[7]=0; v[7]<4; v[7]++) { if (v[7]==v[4] || v[7]==v[5] || v[7]==v[6]) continue; b[4] = nGroup[nTeam][h2][v[4]]; b[5] = nGroup[nTeam][h2][v[5]]; b[6] = nGroup[nTeam][h2][v[6]]; b[7] = nGroup[nTeam][h2][v[7]]; /************************************************************************/ for (v[8]=0; v[8]<4; v[8]++) { if ((b[0]+b[4]+nGroup[nTeam][h3][v[8]])>=34 || (b[4]+b[7]+nGroup[nTeam][h3][v[8]])>=34) continue; for (v[9]=0; v[9]<4; v[9]++) { if (v[9]==v[8] || (b[1]+b[5]+nGroup[nTeam][h3][v[9]])>=34 || (b[5]+b[6]+nGroup[nTeam][h3][v[9]])>=34 || (b[3]+b[6]+nGroup[nTeam][h3][v[9]])>=34) continue; for (v[10]=0; v[10]<4; v[10]++) { if (v[10]==v[8] || v[10]==v[9] || (b[2]+b[6]+nGroup[nTeam][h3][v[10]])>=34 || (b[0]+b[5]+nGroup[nTeam][h3][v[10]])>=34 || (b[5]+b[6]+nGroup[nTeam][h3][v[9]]+nGroup[nTeam][h3][v[10]])!=34) continue; for (v[11]=0; v[11]<4; v[11]++) { if (v[11]==v[8] || v[11]==v[9] || v[11]==v[10] || (b[3]+b[7]+nGroup[nTeam][h3][v[11]])>=34 || (b[4]+b[7]+nGroup[nTeam][h3][v[8]]+nGroup[nTeam][h3][v[11]])!=34) continue; b[8] = nGroup[nTeam][h3][v[8]]; b[9] = nGroup[nTeam][h3][v[9]]; b[10] = nGroup[nTeam][h3][v[10]]; b[11] = nGroup[nTeam][h3][v[11]]; /************************************************************************/ for (v[12]=0; v[12]<4; v[12]++) { if ((b[0]+b[4]+b[8]+nGroup[nTeam][h4][v[12]])!=34 || (b[3]+b[6]+b[9]+nGroup[nTeam][h4][v[12]])!=34 || (b[0]+b[3]+nGroup[nTeam][h4][v[12]])>=34) continue; for (v[13]=0; v[13]<4; v[13]++) { if (v[13]==v[12] || (b[1]+b[5]+b[9]+nGroup[nTeam][h4][v[13]])!=34 || (b[1]+b[2]+nGroup[nTeam][h4][v[13]])>=34) continue; for (v[14]=0; v[14]<4; v[14]++) { if (v[14]==v[12] || v[14]==v[13] || (b[2]+b[6]+b[10]+nGroup[nTeam][h4][v[14]])!=34 || (b[1]+b[2]+nGroup[nTeam][h4][v[13]]+nGroup[nTeam][h4][v[14]])!=34) continue; for (v[15]=0; v[15]<4; v[15]++) { if (v[15]==v[12] || v[15]==v[13] || v[15]==v[14]) continue; b[12] = nGroup[nTeam][h4][v[12]]; b[13] = nGroup[nTeam][h4][v[13]]; b[14] = nGroup[nTeam][h4][v[14]]; b[15] = nGroup[nTeam][h4][v[15]]; // cout<<b[0]<<" "<<b[1]<<" "<<b[2]<<" "<<b[3]<<endl; // cout<<b[4]<<" "<<b[5]<<" "<<b[6]<<" "<<b[7]<<endl; // cout<<b[8]<<" "<<b[9]<<" "<<b[10]<<" "<<b[11]<<endl; // cout<<b[12]<<" "<<b[13]<<" "<<b[14]<<" "<<b[15]<<endl; // cout<<endl; total++; } } } } /************************************************************************/ } } } } /************************************************************************/ } } } } /************************************************************************/ } } } } /************************************************************************/ } } } } } // file.Open(_T("c://number1.txt"),CFile::modeCreate|CFile::modeReadWrite); // file.Write(str, str.GetLength()); // file.Close(); cout<<"the total number is:"<<total<<endl; dwTick = ::GetTickCount() - dwTick; cout<<"the total ticks is:"<<dwTick<<endl; }
代码详细解释:
http://topic.csdn.net/u/20100325/17/08c7e1b6-0e43-4b41-b331-93ecc744f69a.html?seed=1019688431&r=64222182#r_64222182
相关文章推荐
- 高通8X16电池BMS算法(二)【转】
- 高效的六面体变换算法实现(一) —— 等圆柱映射 与 六面体映射
- 算法题16 二分查找及相关题目
- php 数组 高效随机抽取指定条记录的算法
- 【算法】如何设计--高效的大数据匹配算法
- 蓝桥杯 基础练习 特殊回文数 高效算法
- OpenCV学习(16) 细化算法(4)
- C#位运算及3道要求高效的算法题
- 筛法:一种高效求解素数表的算法
- 在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。
- 推荐系统:技术、评估及高效算法 第3章
- 根据数据库表中记录自动构造一棵结构树的一种高效算法
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- 问题描述如下: 有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明); 要求找出这2.5亿个数字里面,不重复的数字的个数; 另外,可用的内存限定为600M; 要求算法尽量高效,最优;
- 算法分析与设计课程16——376. Wiggle Subsequence
- JavaScript删除数组重复元素的5个高效算法
- 查找某些字符是否在另一个字符串里出现的高效算法
- JavaScript删除数组重复元素的5个高效算法
- njupt_oj:简单矩阵 :超时,求高效算法
- LeetCode: Count Primes(计算n以内素数个数:高效算法)