|
上次是用DFS做的,有些题目BFS和DFS都可以做的。
- #include<iostream>
- #include<iomanip>
- using namespace std;
- int a[200],x,y,n,iiii;
- int head,tail,temp;
- int m[10000][20],f[10000],l[10000];//这里做成结构类型更好
- int tm[20],tl,tx;
- //所有的数组都是0起步的
- bool bfscan(int i,int k) //判断前面i-1个数字中能有某两个数字之和为k
- {
- bool bb=false;
- for (int ii=0; ii<=i; ii++)
- for (int jj=0; jj<=i; jj++)
- if (tm[ii]+tm[jj]==k) bb=true; //很笨的做法没有优化
- return bb;
- }
- void bfs(int i)
- {
- int j,k;bool bb;
- m[0][0]=1;m[0][1]=2;f[0]=0;l[0]=1;//初始值
- head=tail=0;bb=false;
- while ((tail>=head) &&(tail<=9991) &&!bb)
- {
- for (j=0;j<=19;j++) tm[j]=m[head][j];//取队首元素
- tl=l[head];
- cout<<head<<':';
- for (j=0;j<=tl;j++) cout<<tm[j]<<' ';cout<<endl;//输出测试
- for(tx=tm[tl]+1;tx<=tm[tl]*2;tx++) //应用规则
- if (bfscan(tl,tx)) //判断前面tl个能否得到j
- {
- tail++;
- tm[tl+1]=tx;
- for (j=0;j<=19;j++) m[tail][j]=tm[j];//加入队尾
- f[tail]=head;l[tail]=tl+1;
- if (i==tx) {bb=true;break;}
- }
- head++;
- }
- for (j=0;j<=l[tail];j++) cout<<m[tail][j]<<' ';
- }
- int main()
- {
- x=20;
- bfs(20);
- }
复制代码
|
|