您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐