上午看了一下stl。。起码有概念了。。具体实践还是看碰上了再说。还差set和map
——————————
——————————
以下题目出自学校acm寒假训练题库,链接在此:
vj搜索专题
Prime Path
bfs思想,由于不熟悉,这个题我是看着别人的题解学习的
记录prime number:
求一个范围内的所有素数,使用埃氏筛法,大大减小复杂度
//将每一个素数的倍数标记为非素数,埃氏筛法;
//门牌号为四位数,所以门牌号最大值不超过9999
bool pri[10010];
void prime()
{
for(int i=2;i<=9999;++i){
pri[i]=true;
}
for(int i=2;i<=9999;++i){
if(pri[i]){//确保为当前最小素数
for(int j=2;j*i<=9999;j++){
pri[j*i]=false;
}
}
}
}
广度优先搜索BFS:
void bfs(int a,int b)
{
queue<path> q;//用队列模拟广搜
path start={a,0};
q.push(start);
bool vis[10010]={false};
vis[start.num]=true;
while(q.size()){
int num0=q.front().num;
int step0=q.front().step;
if(num0==b){
ans=step0;
cout<<ans<<endl;
break;
}
//改变个位(如果i=0必是素数)
for(int i=1;i<=9;i++){
int num1=num0/10*10+i;
if(vis[num1]==false&&pri[num1]==true){
//cout<<num1<<endl;
path the={num1,step0+1};
q.push(the);
vis[num1]=true;
}
}
//改变十位
for(int i=0;i<=9;i++){
int num1=num0/100*100+i*10+num0%10;
if(vis[num1]==false&&pri[num1]==true){
//cout<<num1<<endl;
path the={num1,step0+1};
q.push(the);
vis[num1]=true;
}
}
//改变百位
for(int i=0;i<=9;i++){
int num1=num0/1000*1000+i*100+num0%100;
if(vis[num1]==false&&pri[num1]==true){
//cout<<num1<<endl;
path the={num1,step0+1};
q.push(the);
vis[num1]=true;
}
}
//改变千位,千位不可为0
for(int i=1;i<=9;i++){
int num1=i*1000+num0%1000;
if(vis[num1]==false&&pri[num1]==true){
//cout<<num1<<endl;
path the={num1,step0+1};
q.push(the);
vis[num1]=true;
}
}
q.pop();
}
}
int main()
{
prime();
int t;
cin>>t;
int x,y;
while(t--){
cin>>x>>y;
bfs(x,y);
}
}
复习一下bfs。。╮( ̄▽ ̄"")╭
———————————
———————————
晚上又学了一下容器,马上就看完了呜呜。
明天早上速度解决容器概念,然后回头来看空下来的那三个贪心题,很有可能那三个题够我搞一天呜呜。
要提高时间的利用效率!!timelogger记一下QwQ