今天上午把昨天找了好久都没有找出错的题a了出来,prime path,总是四位数字,从开始的素数变换到最终的那个素数,求的是要变换几步(每一次变换一个数,并且都是素数)这个题也不是很难, 有一部分时差不多的,复制过来之后很小的数据漏了没改过来,真的找了好久。上午还有一道洗扑克,(有规则的洗牌)很简单了,没有用到搜索,百度发现这是一道模拟题。晚上的几个小时做了一道广搜打印路径的题,(水桶到水的题 pots)感觉这个题也是经典。
下午的练习第一道很快写出来了,但是却wa,一个小的问题,却花掉很长的时间。
//变 素数问题 广搜也要记得标记 ,要不然重复的元素会压到队列 筛素数
code:
#if 0
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
int prime[10000];
bool vis[10000];
void goprime() //dabiao
{
prime[0]=prime[1]=0;prime[2]=1;
for(int i=3; i<=10000; i++)
{
if(i%2==0)
{
prime[i]=0;
}
else
{
prime[i]=1;
}
}
int k=sqrt(10000);
for(int i=2; i<=k; i++)
{
if(prime[i])
for(int j=i*i; j<=10000; j+=2*i)
{
prime[j]=0;
}
}
}
struct go
{
int x,t;
}a,b;
void bfs()
{
queue<go> q;
q.push(a);
while(!q.empty())
{
go it;
it=q.front();
q.pop();
if(it.x==b.x)
{
cout<<it.t<<endl;
return;
}
int x1,x2,x3,x4;
x1=it.x/1000;
x2=it.x%1000/100;
x3=it.x%100/10;
x4=it.x%10;
go its;
for(int i=1; i<10; i++)
{
if(x1!=i)
{
int x=i*1000+x2*100+x3*10+x4;
if(prime[x] && !vis[x])
{
vis[x]=1;
its.x=x;
its.t=it.t+1;
q.push(its);
}
}
}
for(int i=0; i<10; i++)
{
if(x2!=i)
{
int x=x1*1000+i*100+x3*10+x4;
if(prime[x] && !vis[x])
{
vis[x]=1;
its.x=x;
its.t=it.t+1;
q.push(its);
}
}
}
for(int i=0; i<10; i++)
{
if(x3!=i)
{
int x=x1*1000+x2*100+i*10+x4;
if(prime[x] && !vis[x])
{
vis[x]=1;
its.x=x;
its.t=it.t+1;
q.push(its);
}
}
}
for(int i=0; i<10; i++)
{
if(x4!=i)
{
int x=x1*1000+x2*100+x3*10+i;
if(prime[x] && !vis[x])
{
vis[x]=1;
its.x=x;
its.t=it.t+1;
q.push(its);
}
}
}
}
cout<<"Impossible"<<endl;
return;
}
int main()
{
int n;
cin>>n;
goprime();
while(n--)
{
memset(vis,0,sizeof(vis));
cin>>a.x>>b.x;
a.t=b.t=0;
vis[a.x]=1;
bfs();
}
}
#endif
洗扑克问题:
//模拟题 洗扑克 Shuffle'm Up 看看洗几次会达到预定的顺序(洗的方式是第一张s2组的在下,第二张s1组的在上,依次,如果不是预期的,再把s12的下边的一半当成s1,上边的一半当成s2)
#if 0
#include<iostream>
using namespace std;
int it;
int main()
{
int T;
cin>>T;
while(T--)
{
int ans=0,cnt=0;
string s1,s2,s12,es12,flag;
int n;
cin>>n;
cin>>s1>>s2>>es12;
for(int i=0; i<n; i++)
{
flag+=s2[i];
flag+=s1[i];
}
while(1)
{
ans++;
for(int i=0; i<n; i++)
{
s12+=s2[i];
s12+=s1[i];
}
// cout<<ans<<": "<< s12<<endl;
if(s12==flag)
{
cnt++;
if(cnt>=2)
{
cout<<++it<<" "<<-1<<endl;
break;
}
}
if(s12==es12)
{
cout<<++it<<" "<<ans<<endl;
break;
}
else
{
s1="";s2="";
for(int i=0; i<n; i++)
{
s1+=s12[i];
}
for(int i=n; i<2*n; i++)
{
s2+=s12[i];
}
s12="";
}
}
}
}
#endif
经典广搜打印路径:
水桶倒水问题(pots)pots链接
code:
//广搜 打印路径问题
//特别新的就是广搜打印出路径来了
//主要是怎么走理清思路,不要重复。
#if 0
#include<iostream>
#include<queue>
using namespace std;
struct go
{
int x,y,t;
string s;
};
int m,n,c;
bool vis[105][105];
bool flag=0;
void sprint(string s)
{
for(int i=0; i<s.size(); i++)
{
if(s[i]=='1')
cout<<"FILL(1)"<<endl;
else
if(s[i]=='2')
cout<<"FILL(2)"<<endl;
else
if(s[i]=='3')
cout<<"POUR(2,1)"<<endl;
else
if(s[i]=='4')
cout<<"POUR(1,2)"<<endl;
else
if(s[i]=='5')
cout<<"DROP(1)"<<endl;
else
if(s[i]=='6')
cout<<"DROP(2)"<<endl;
}
}
void bfs()
{
queue<go> q;
go p;
p.t=1;
p.x=m;
p.y=0;
p.s='1';
q.push(p);
p.t=1;
p.x=0;
p.y=n;
p.s='2';
q.push(p);
while(!q.empty())
{
go now;
now=q.front();
q.pop();
if(now.x==c||now.y==c)
{
cout<<now.t<<endl;
sprint(now.s);
flag=1;
return;
}
if(now.x<m) //自来水加水
{
go a;
a.x=m;
a.y=now.y;
if(vis[a.x][a.y]==0)
{
a.t=now.t+1;
vis[a.x][a.y]=1;
a.s=now.s+'1';
q.push(a);
}
if(now.y>0) //水桶加水
{
int cx=m-now.x;
if(now.y>=cx)
{
a.x=m;
a.y=now.y-cx;
}
else
{
a.x=now.x+now.y;
a.y=0;
}
if(vis[a.x][a.y]==0)
{
a.t=now.t+1;
vis[a.x][a.y]=1;
a.s=now.s+'3';
q.push(a);
}
}
}
if(now.y<n) //自来水加水
{
go a;
a.x=now.x;
a.y=n;
if(vis[a.x][a.y]==0)
{
a.t=now.t+1;
vis[a.x][a.y]=1;
a.s=now.s+'2';
q.push(a);
}
if(now.x>0) //水桶加水
{
int cy=n-now.y;
if(now.x>=cy)
{
a.y=n;
a.x=now.x-cy;
}
else
{
a.y=now.x+now.y;
a.x=0;
}
if(vis[a.x][a.y]==0)
{
a.t=now.t+1;
vis[a.x][a.y]=1;
a.s=now.s+'4';
q.push(a);
}
}
}
if(now.x>0) //倒水
{
go a;
a.x=0;
a.y=now.y;
if(vis[a.x][a.y]==0)
{
a.t=now.t+1;
vis[a.x][a.y]=1;
a.s=now.s+'5';
q.push(a);
}
}
if(now.y>0) //倒水
{
go a;
a.y=0;
a.x=now.x;
if(vis[a.x][a.y]==0)
{
a.t=now.t+1;
vis[a.x][a.y]=1;
a.s=now.s+'6';
q.push(a);
}
}
}
}
int main()
{
cin>>m>>n>>c;
vis[0][0]=1;
bfs();
if(flag==0)
{
cout<<"impossible"<<endl;
}
}
#endif