c++:深度优先搜索(24点)

来源:互联网 发布:淘宝客佣金计算规范 编辑:程序博客网 时间:2024/06/02 08:54

今天把24点的深搜(递归)程序轻松(努力)的读懂了,大概的程序我贴在下面

#include<bits/stdc++.h>
using namespace std;
int T[4],r[3][4],w;


void print()
{
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
{
if(j==1)//j=1ʱ´ú±í·ûºÅ 
{
switch(r[i][1])
{
case 0:printf("+");break;
case 1:printf("-");break;
case 2:printf("*");break;
case 3:printf("/");break;
}
}
else
if(j==3) 
printf("=%d\n",r[i][3]);
else
printf("%d",r[i][j]);
}
printf("=====================================\n\n");
w++;
}


void find(int A[],int n)
{
if(n==1&&A[0]==24)
print();
else
if(n==1)
return;
else
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)

{
int B[4],a,b,k=0;
a=A[i];
b=A[j];
if(b>a)
swap(a,b); 
for(int p=0;p<n;p++)
if(p!=i&&p!=j) 
B[k++]=A[p];
r[4-n][0]=a;
r[4-n][2]=b;
for(int t=0;t<4;t++)
{
r[4-n][1]=t;
switch(t)
{
case 0:r[4-n][3]=a+b;break;
case 1:r[4-n][3]=a-b;break;
case 2:r[4-n][3]=a*b;break;
case 3:if(b!=0)r[4-n][3]=a/b;break;
}
if(t==3&&(b==0||a%b!=0))
break;
B[k]=r[4-n][3];
find(B,n-1);
}

}
}
int main()
{
for(int i=0;i<4;i++)
cin>>T[i];
find(T,4); 
cout<<w;
return 0;
}

就像这个,先从根节点的四个数开始,搜到第一个左子树+,变成3个数有搜到第一个+的左子树+又搜到左子树+发现成立后打印,之后退到第二个+重新搜索。

大概就是这样子了···



原创粉丝点击