19/11/27 小练

搜索小练


记得补题

就写了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 }
View Cod

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

贴一份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 }
View Code

还剩七道,明天再战

猜你喜欢

转载自www.cnblogs.com/luoyugongxi/p/11945506.html