搜索小练
记得补题
就写了ABCFL
A题(poj1321):做过一次……
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<queue> 6 #include<stack> 7 #include<cmath> 8 using namespace std; 9 #define mem(a,b) memset(a,b,sizeof(a)) 10 #define inf 0x3f3f3f3f 11 #define mod 1000000007 12 #define ll long long 13 #define rep(i,a,b) for(int i=a;i<=b;i++) 14 const int maxn=10; 15 char g[maxn][maxn]; 16 int vis[maxn][maxn],xx[maxn],yy[maxn]; 17 int n,m,maxx,sum; 18 void dfs(int sum,int r) 19 { 20 if(!sum){ 21 maxx++; 22 return; 23 } 24 for(int i=r;i<n;i++){ 25 if(!xx[i] && n>=(sum+i)){ 26 for(int j=0;j<n;j++){ 27 if(!yy[j]){ 28 if(g[i][j]=='#'&& !vis[i][j]){ 29 yy[j]=1;xx[i]=1;vis[i][j]=1; 30 dfs(sum-1,r+1); 31 yy[j]=0;xx[i]=0;vis[i][j]=0; 32 } 33 } 34 } 35 } 36 } 37 } 38 int main() 39 { 40 while(~scanf("%d%d",&n,&m)){ 41 if(n==-1 && m==-1){break;} 42 for(int i=0;i<n;i++){ 43 scanf("%s",g[i]); 44 xx[i]=0,yy[i]=0; 45 } 46 mem(vis,0); 47 maxx=0; 48 dfs(m,0); 49 printf("%d\n",maxx); 50 } 51 return 0; 52 }
B题(poj2251):
题面:找有没有S到E的最短路程,如果没有就输出Trapped!
思路:直接bfs
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #define mem(a,b) memset(a,b,sizeof(a)) 8 #define inf 0x3f3f3f3f 9 using namespace std; 10 const int maxn=110; 11 char mp[35][35][35]; 12 int vis[35][35][35],n,m,l; 13 int sx,sy,sc,ex,ey,ec,ans; 14 int bu[6]={0,0,0,0,1,-1},bu1[6]={0,0,1,-1,0,0},bu2[6]={1,-1,0,0,0,0}; 15 struct node{ 16 int x,y,c,temp; 17 node(){} 18 node(int xx,int yy,int cc,int t):x(xx),y(yy),c(cc),temp(t){} 19 friend bool operator<(const node a,const node b){ 20 return a.temp>b.temp; 21 } 22 }; 23 int bfs(){ 24 mem(vis,0); 25 priority_queue<node> q; 26 q.push(node(sx,sy,sc,0)); 27 vis[sc][sx][sy]=1; 28 while(!q.empty()){ 29 node tt=q.top();q.pop(); 30 31 for(int i=0;i<6;i++){ 32 int cc=tt.c+bu[i],xx=tt.x+bu1[i],yy=tt.y+bu2[i],tem=tt.temp+1; //cout<<cc<<xx<<yy<<endl; 33 if(ec==cc && xx==ex && yy==ey){return tem;} 34 if(mp[cc][xx][yy]=='#' || vis[cc][xx][yy] || cc<0 || cc>=l || xx<0 || xx>=n || yy<0 || yy>=m){continue;} 35 vis[cc][xx][yy]=1; 36 q.push(node(xx,yy,cc,tem)); 37 } 38 } 39 return -1; 40 } 41 int main(){ 42 while(~scanf("%d%d%d",&l,&n,&m)){ 43 if(n==0 && m==0 && l==0){break;} 44 for(int i=0;i<l;i++){ 45 //getchar(); 46 for(int j=0;j<n;j++){ 47 scanf("%s",mp[i][j]); 48 for(int k=0;k<m;k++){ 49 if(mp[i][j][k]=='S'){sc=i,sx=j,sy=k;} 50 if(mp[i][j][k]=='E'){ec=i,ex=j,ey=k;} 51 } 52 } 53 //getchar(); 54 } 55 56 ans=bfs(); 57 if(ans==-1){ 58 printf("Trapped!\n"); 59 } 60 else{ 61 printf("Escaped in %d minute(s).\n",ans); 62 } 63 } 64 return 0; 65 }
C题(poj3278):
题面:有三种操作1. 加一 2 .减一 3 .乘2,一个数字最少需要几步能够另外一个数字(0~1e5)
思路:直接bfs
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #define mem(a,b) memset(a,b,sizeof(a)) 8 #define inf 0x3f3f3f3f 9 using namespace std; 10 const int maxn=1e5+10; 11 int vis[maxn],n,m,c; 12 struct node{ 13 int x,y; 14 node(){} 15 node(int xx,int yy):x(xx),y(yy){} 16 friend bool operator<(const node a,const node b){ 17 return a.y>b.y; 18 } 19 }; 20 int bfs(){ 21 priority_queue<node> q; 22 q.push(node(n,0)); 23 vis[n]=1; 24 while(!q.empty()){ 25 node k=q.top();q.pop(); 26 int x1=k.x-1,x2=k.x+1,x3=k.x*2,tt=k.y+1; 27 if(x1==m){return tt;} 28 if(x2==m){return tt;} 29 if(x3==m){return tt;} 30 if(x1>=0 && x1<=100000 && !vis[x1]){ 31 vis[x1]=1;q.push(node(x1,tt)); 32 } 33 if(x2>=0 && x2<=100000 && !vis[x2]){ 34 vis[x2]=1;q.push(node(x2,tt)); 35 } 36 if(x3>=0 && x3<=100000 && !vis[x3]){ 37 vis[x3]=1;q.push(node(x3,tt)); 38 } 39 } 40 } 41 int main(){ 42 while(~scanf("%d%d",&n,&m)){ 43 if(n==m){ 44 printf("0\n");continue; 45 } 46 mem(vis,0); 47 printf("%d\n",bfs()); 48 } 49 return 0; 50 }
F题(poj3126):
题面:给T组,每组给两个4位数的素数(无前导零),一个素数变换成另一个素数,是按位进行的,比如1033》》1733算一步,求最少需要几次操作
思路:因为只有4位,直接预处理,用链式前向星链接,bfs直接找
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #define mem(a,b) memset(a,b,sizeof(a)) 9 #define inf 0x3f3f3f3f 10 using namespace std; 11 const int maxn=1e5+10; 12 int mp[maxn]={0},n,m,head[maxn],cnt,vis[maxn]; 13 struct edge{ 14 int n,next; 15 edge(){} 16 edge(int nn,int t):n(nn),next(t){} 17 }a[maxn<<1]; 18 struct node{ 19 int x,t; 20 node(){} 21 node(int xx,int yy):x(xx),t(yy){} 22 friend bool operator<(const node a,const node b){ 23 return a.t>b.t; 24 } 25 }; 26 void upda(int x,int y){ 27 a[cnt]=edge(y,head[x]); 28 head[x]=cnt++; 29 } 30 bool pan(int x){ 31 //int xx=(int)sqrt(x); 32 for(int i=2;i*i<=x;i++){ 33 if(x%i==0){return false;} 34 } 35 return true; 36 } 37 void chuli(int x){ 38 int k=x%10,kk=x/10; 39 for(int i=1;i<=k;i++){ 40 if(mp[x-i]){upda(x,x-i);} 41 } 42 for(int i=1;i<10-k;i++){ 43 if(mp[x+i]){upda(x,x+i);} 44 } 45 k=kk%10,kk/=10; 46 for(int i=1;i<=k;i++){ 47 if(mp[x-i*10]){upda(x,x-i*10);} 48 } 49 for(int i=1;i<10-k;i++){ 50 if(mp[x+i*10]){upda(x,x+i*10);} 51 } 52 k=kk%10,kk/=10; 53 for(int i=1;i<=k;i++){ 54 if(mp[x-i*100]){upda(x,x-i*100);} 55 } 56 for(int i=1;i<10-k;i++){ 57 if(mp[x+i*100]){upda(x,x+i*100);} 58 } 59 k=kk%10; 60 for(int i=1;i<=k;i++){ 61 if(mp[x-i*1000]){upda(x,x-i*1000);} 62 } 63 for(int i=1;i<10-k;i++){ 64 if(mp[x+i*1000]){upda(x,x+i*1000);} 65 } 66 } 67 int bfs() 68 { 69 mem(vis,0); 70 priority_queue<node> q; 71 q.push(node(n,0));vis[n]=1; 72 while(!q.empty()){ 73 node tt=q.top();q.pop(); 74 if(tt.x==m){ 75 return tt.t; 76 } 77 for(int i=head[tt.x];i!=-1;i=a[i].next){ 78 if(!vis[a[i].n]){ 79 vis[a[i].n]=1;q.push(node(a[i].n,tt.t+1)); 80 } 81 } 82 } 83 return -1; 84 } 85 int main(){ 86 cnt=0;mem(head,-1); 87 for(int i=1000;i<10000;i++){ 88 if(pan(i)){ 89 mp[i]=1; 90 } 91 } 92 for(int i=1000;i<10000;i++){ 93 if(mp[i]){ 94 chuli(i); 95 } 96 } 97 int t; 98 while(~scanf("%d",&t)){ 99 for(int i=0;i<t;i++){ 100 scanf("%d%d",&n,&m); 101 printf("%d\n",bfs()); 102 } 103 } 104 return 0; 105 }
L题(hdu1495)
题面:给了两个杯子的大小,和可乐的量,问能不能平分,如果能平分,要多少次操作
思路:bfs+倒水问题,看了大佬写法居然是规律题,数论不有点理解不了
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #define mem(a,b) memset(a,b,sizeof(a)) 9 #define inf 0x3f3f3f3f 10 using namespace std; 11 const int maxn=1e5+10; 12 struct node{ 13 int a,b,s,t; 14 node(){} 15 node(int aa,int bb,int ss,int tt):a(aa),b(bb),s(ss),t(tt){} 16 }cole[110]; 17 int a,b,s; 18 int vis[110][110]; 19 int bfs() 20 { 21 queue<node> q; 22 memset(vis,0,sizeof(vis)); 23 q.push(node(0,0,s,0)); 24 vis[a][b]=1; 25 while(!q.empty()) 26 { 27 node u=q.front(),v; 28 if(u.a==s/2 && u.s==s/2) 29 return u.t; 30 if(u.s && u.a!=a){ 31 int c=a-u.a; 32 if(u.s>=c) v.a=a,v.s=u.s-c; 33 else v.a=u.a+u.s,v.s=0; 34 v.b=u.b; v.t=u.t+1; 35 if(!vis[v.a][v.b]){ 36 q.push(v); 37 vis[v.a][v.b]=1; 38 } 39 } 40 if(u.s && u.b!=b){ 41 int c=b-u.b; 42 if(u.s>=c) v.b=b,v.s=u.s-c; 43 else v.b=u.b+u.s,v.s=0; 44 v.a=u.a; v.t=u.t+1; 45 if(!vis[v.a][v.b]){ 46 q.push(v); 47 vis[v.a][v.b]=1; 48 } 49 } 50 if(u.a && u.s!=s){ 51 int c=s-u.s; 52 if(u.a>=c) v.s=s,v.a=u.a-c; 53 else v.s=u.s+u.a,v.a=0; 54 v.b=u.b; v.t=u.t+1; 55 if(!vis[v.a][v.b]){ 56 q.push(v); 57 vis[v.a][v.b]=1; 58 } 59 } 60 if(u.a && u.b!=b){ 61 int c=b-u.b; 62 if(u.a>=c) v.b=b,v.a=u.a-c; 63 else v.b=u.b+u.a,v.a=0; 64 v.s=u.s; v.t=u.t+1; 65 if(!vis[v.a][v.b]){ 66 q.push(v); 67 vis[v.a][v.b]=1; 68 } 69 } 70 if(u.b && u.a!=a){ 71 int c=a-u.a; 72 if(u.b>=c) v.a=a,v.b=u.b-c; 73 else v.a=u.a+u.b,v.b=0; 74 v.s=u.s; v.t=u.t+1; 75 if(!vis[v.a][v.b]){ 76 q.push(v); 77 vis[v.a][v.b]=1; 78 } 79 } 80 if(u.b && u.s!=s){ 81 int c=s-u.s; 82 if(u.b>=c) v.s=s,v.b=u.b-c; 83 else v.s=u.s+u.b,v.b=0; 84 v.a=u.a; v.t=u.t+1; 85 if(!vis[v.a][v.b]){ 86 q.push(v); 87 vis[v.a][v.b]=1; 88 } 89 } 90 q.pop(); 91 } 92 return 0; 93 } 94 int main() 95 { 96 while(scanf("%d%d%d",&s,&a,&b),s||a||b){ 97 if(s&1){ 98 puts("NO");continue; 99 } 100 if(a<b) swap(a,b); 101 int ans=bfs(); 102 if(ans) printf("%d\n",ans); 103 else puts("NO"); 104 } 105 return 0; 106 }
贴一份gcd的写法
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #define mem(a,b) memset(a,b,sizeof(a)) 9 #define inf 0x3f3f3f3f 10 using namespace std; 11 const int maxn=1e5+10; 12 int gcd(int a, int b) { 13 return b==0?a:gcd(b,a%b); 14 } 15 int main() 16 { 17 int a,b,c; 18 while(~scanf("%d%d%d",&a,&b,&c)) { 19 if(a==0 && b==0 && c==0){break;} 20 a/= gcd(b,c); 21 if(a&1){ 22 printf("NO\n"); 23 } 24 else{ 25 printf("%d\n",a-1); 26 } 27 } 28 }
还剩七道,明天再战