华师一附中OI组
标题:
用BFS的方法求2^100至少要算多少次乘法
[打印本页]
作者:
admin
时间:
2018-5-12 22:20
标题:
用BFS的方法求2^100至少要算多少次乘法
上次是用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);
}
复制代码
作者:
admin
时间:
2018-5-12 23:17
#include<iostream>
using namespace std;
const int mm=10010; // 最多搜索多少个节点
int a[10][mm],l[mm];
int head,tail;
int aa[10],la;
bool b;
int i,k,kk;
void printout(int i)
{
int j;
cout<<i<<':';
for (j=0; j<=9; j++) cout<<a[j][i]<<' ';
cout<<' '<<l[i];
cout<<endl;
}
bool can(int i,int j) ///i 能不能出现在第j位
{
int i1,i2;
bool b=false;
for (i1=0; i1<=j-1; i1++)
for (i2=0; i2<=j-1; i2++)
if (aa[i1]+aa[i2]==i) b=true;
return b;
}
int main()
{
head=tail=0;
a[0][head]=1;
a[1][head]=2;
l[0]=1; ///首元素显然是[1,2]
b=false; /// 表示没有找到
while ((!b) && (tail>=head) && (tail<=mm-100))
{
for (i=0; i<=9; i++) aa[i]=a[i][head];
la=l[head];///取出头元素
kk=a[la][head];
///printout(head);
for (k=kk+1; k<=kk*2; k++) ///按规则生儿子
if (can(k,la+1)) ///符合条件进队列
{
tail++;/// 写进去
for (i=0; i<=9; i++) a[i][tail]=aa[i];
a[la+1][tail]=k;
l[tail]=la+1;
///printout(tail); 一般在这里加调试
if (a[la+1][tail]==10)
{
b=true;
break;
}
}
head++;
}
if (b) for (i=0; i<=la+1; i++) cout<<a[i][tail];
else if (tail<head) cout<<"No Answer!";
else if (tail>mm-100) cout<<"cannot found!";
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2