zoukankan      html  css  js  c++  java
  • hdu 1973+hdu 2364+hdu 2416+hdu 2822+hdu 2645(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1973

    思路:简单bfs,先打个素数表,然后就是广搜搞一下就ok了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<queue>
     6 #include<string>
     7 using namespace std;
     8 #define MAXN 10100
     9 struct Node{
    10     string str;
    11     int step;
    12 };
    13 string st,ed;
    14 bool mark[MAXN];
    15 bool Prime[MAXN];
    16 
    17 void IsPrime(){
    18     memset(Prime,true,sizeof(Prime));
    19     Prime[0]=Prime[1]=false;
    20     for(int i=2;i*i<MAXN;i++){
    21         for(int j=i*i;j<MAXN;j+=i){
    22             if(Prime[i])Prime[j]=false;
    23         }
    24     }
    25 }
    26 
    27 void bfs(){
    28     memset(mark,false,sizeof(mark));
    29     queue<Node>Q;
    30     Node p,q;
    31     p.str=st,p.step=0;
    32     int x=0;
    33     for(int i=0;i<4;i++)x=x*10+p.str[i]-'0';
    34     mark[x]=true;
    35     Q.push(p);
    36     while(!Q.empty()){
    37         p=Q.front();
    38         Q.pop();
    39         if(p.str==ed){
    40             printf("%d\n",p.step);
    41             return ;
    42         }
    43         for(int i=0;i<4;i++){
    44             q=p;
    45             for(int j=0;j<=9;j++){
    46                 if(i==0&&j==0)continue;
    47                 if((q.str[i]-'0')!=j)q.str[i]=j+'0';
    48                 int x=0;
    49                 for(int k=0;k<4;k++)x=x*10+q.str[k]-'0';
    50                 if(Prime[x]&&!mark[x]){
    51                     mark[x]=true;
    52                     q.step=p.step+1;
    53                     Q.push(q);
    54                 }
    55             }
    56         }
    57     }
    58     puts("Impossible");
    59 }
    60 
    61 
    62 
    63 int main(){
    64     IsPrime();
    65     int _case;
    66     scanf("%d",&_case);
    67     while(_case--){
    68         cin>>st>>ed;
    69         bfs();
    70     }
    71     return 0;
    72 }
    View Code

     题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2364

    思路:就是转弯的时候要判断一下,如果当前前进的方向与原来的方向一致,那么就直接转,否则,就要分两种情况,一种是上下,一种是左右,如果当前两边都为‘#’,就可以前进,否则是不能前进的,还有就是要注意的地方是“You never turn around and go back“.

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 using namespace std;
     6 #define MAXN 100
     7 struct Node{
     8     int x,y,dir,step;
     9 };
    10 char map[MAXN][MAXN];
    11 bool mark[MAXN][MAXN][4];
    12 int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
    13 Node st;
    14 int n,m;
    15 
    16 void bfs(){
    17     memset(mark,false,sizeof(mark));
    18     queue<Node>Q;
    19     Node p,q;
    20     Q.push(st);
    21     while(!Q.empty()){
    22         p=Q.front();
    23         Q.pop();
    24         if(p.x==1||p.x==n||p.y==1||p.y==m){
    25             printf("%d\n",p.step);
    26             return ;
    27         }
    28         for(int i=0;i<4;i++){
    29             int xx=p.x+dir[i][0];
    30             int yy=p.y+dir[i][1];
    31             if(!mark[xx][yy][i]&&map[xx][yy]!='#'){
    32                 if((i%2==p.dir%2)){
    33                     if(i==p.dir){
    34                         if(i%2==0&&map[p.x][p.y+1]=='#'&&map[p.x][p.y-1]=='#'){
    35                             mark[xx][yy][i]=true;
    36                             q.x=xx,q.y=yy,q.step=p.step+1,q.dir=i;
    37                             Q.push(q);
    38                         }else if(i%2==1&&map[p.x+1][p.y]=='#'&&map[p.x-1][p.y]=='#'){
    39                             mark[xx][yy][i]=true;
    40                             q.x=xx,q.y=yy,q.step=p.step+1,q.dir=i;
    41                             Q.push(q);
    42                         }
    43                     }
    44                 }else {
    45                     q.x=xx,q.y=yy,q.step=p.step+1,q.dir=i;
    46                     mark[xx][yy][i]=true;
    47                     Q.push(q);
    48                 }
    49             }
    50         }
    51     }
    52     puts("-1");
    53 }
    54 
    55 
    56 
    57 int main(){
    58     int _case;
    59     scanf("%d",&_case);
    60     while(_case--){
    61         scanf("%d%d",&n,&m);
    62         for(int i=1;i<=n;i++){
    63             scanf("%s",map[i]+1);
    64             for(int j=1;j<=m;j++){
    65                 if(map[i][j]=='@')st.x=i,st.y=j,st.step=0,st.dir=-1;
    66             }
    67         }
    68         bfs();
    69     }
    70     return 0;
    71 }
    View Code

     题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2416

    wa了无数次的一道题,不知道怎么回事,感觉不用优先队列也没关系,可就是出不来答案,而一用优先队列就过了。。。郁闷中。。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 using namespace std;
     6 #define MAXN 110
     7 #define inf 1<<30
     8 struct Node{
     9     int x,y,key;
    10     bool operator < (const Node &p) const {
    11         return p.time<time;
    12     }
    13     int time;
    14 };
    15 
    16 int Time[MAXN][MAXN][33];
    17 char map[MAXN][MAXN];
    18 int n,m;
    19 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    20 
    21 void bfs(){
    22     memset(Time,-1,sizeof(Time));
    23     priority_queue<Node>Q;
    24     Node p;
    25     int ans=inf;
    26     for(int i=0;i<n;i++){
    27         for(int j=0;j<m;j++){
    28             if(map[i][j]=='#'||(map[i][j]>='A'&&map[i][j]<='Z')){
    29                 p.x=i,p.y=j,p.time=0;
    30                 if(map[i][j]=='#')p.key=0;
    31                 else p.key=(map[i][j]-'A'+1);
    32                 Q.push(p);
    33                 map[i][j]='*';
    34                 Time[p.x][p.y][p.key]=0;
    35             }
    36         }
    37     }
    38     while(!Q.empty()){
    39         p=Q.top();
    40         Q.pop();
    41         Node q;
    42         for(int i=0;i<4;i++){
    43             q.x=p.x+dir[i][0];
    44             q.y=p.y+dir[i][1];
    45             q.key=p.key;
    46             if(q.x<0||q.x>=n||q.y<0||q.y>=m||map[q.x][q.y]=='*')
    47                 continue;
    48             if(map[q.x][q.y]=='.'){
    49                 if(Time[q.x][q.y][q.key]==-1||p.time<Time[q.x][q.y][q.key]){
    50                     q.time=p.time;
    51                     Time[q.x][q.y][q.key]=q.time;
    52                     Q.push(q);
    53                 }
    54             }else if(map[q.x][q.y]>'0'&&map[q.x][q.y]<='9'){
    55                 if(q.key>0&&(Time[q.x][q.y][q.key-1]==-1||p.time<Time[q.x][q.y][q.key-1])){
    56                     q.key=p.key-1,q.time=p.time;
    57                     Time[q.x][q.y][q.key]=q.time;
    58                     Q.push(q);
    59                 }
    60                 if(Time[q.x][q.y][p.key]==-1||(p.time+(map[q.x][q.y]-'0')<Time[q.x][q.x][p.key])){
    61                     q.key=p.key;
    62                     q.time=p.time+map[q.x][q.y]-'0';
    63                     Time[q.x][q.y][q.key]=q.time;
    64                     Q.push(q);
    65                 }
    66             }else if(map[q.x][q.y]=='$'&&p.time<ans){
    67                 ans=p.time;
    68             }
    69         }
    70     }
    71     ans<inf?printf("%d\n",ans):puts("IMPOSSIBLE");
    72 }
    73 
    74 
    75 int main(){
    76     while(1){
    77         n=0;
    78         while(gets(map[n])){
    79             if(map[n][0]=='-')return 0;
    80             if(strlen(map[n])<1)break;
    81             n++;
    82         }
    83         m=strlen(map[0]);
    84         bfs();
    85     }
    86     return 0;
    87 }
    View Code

     题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2822

    思路:就是优先队列的简单应用。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 using namespace std;
     6 #define MAXN 1010
     7 #define inf 1<<30
     8 struct Node{
     9     int x,y,step;
    10     bool operator < (const Node &p) const {
    11         return p.step<step;
    12     }
    13 };
    14 
    15 char map[MAXN][MAXN];
    16 bool mark[MAXN][MAXN];
    17 int n,m;
    18 Node st,ed;
    19 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    20 
    21 void bfs(){
    22     memset(mark,false,sizeof(mark));
    23     priority_queue<Node>Q;
    24     Node p,q;
    25     mark[st.x][st.y]=true;
    26     Q.push(st);
    27     while(!Q.empty()){
    28         p=Q.top();
    29         Q.pop();
    30         if(p.x==ed.x&&p.y==ed.y){
    31             printf("%d\n",p.step);
    32             return ;
    33         }
    34         for(int i=0;i<4;i++){
    35             q.x=p.x+dir[i][0];
    36             q.y=p.y+dir[i][1];
    37             if(q.x<1||q.x>n||q.y<1||q.y>m||mark[q.x][q.y])
    38                 continue;
    39             if(map[q.x][q.y]=='X'){
    40                 q.step=p.step;
    41                 if(!mark[q.x][q.y]){
    42                     mark[q.x][q.y]=true;
    43                     Q.push(q);
    44                 }
    45             }else if(map[q.x][q.y]=='.'){
    46                 q.step=p.step+1;
    47                 if(!mark[q.x][q.y]){
    48                     mark[q.x][q.y]=true;
    49                     Q.push(q);
    50                 }
    51             }
    52         }
    53     }
    54 }
    55 
    56 
    57 int main(){
    58     while(scanf("%d%d",&n,&m),(n+m)){
    59         for(int i=1;i<=n;i++)
    60             scanf("%s",map[i]+1);
    61         scanf("%d%d",&st.x,&st.y);
    62         scanf("%d%d",&ed.x,&ed.y);
    63         st.step=ed.step=0;
    64         bfs();
    65     }
    66     return 0;
    67 }
    68         
    View Code

     题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2645

    思路:就是对于每个‘0’位置进行bfs,找最近的‘1’,orz...一开始还以为会超时呢!!!

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 using namespace std;
     6 #define MAXN 200
     7 struct Node{
     8     int x,y,dist;
     9 };
    10 bool mark[MAXN][MAXN];
    11 char map[MAXN][MAXN];
    12 int result[MAXN][MAXN];
    13 int n,m;
    14 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    15 
    16 int bfs(int x,int y){
    17     memset(mark,false,sizeof(mark));
    18     queue<Node>Q;
    19     Node p,q;
    20     p.x=x,p.y=y,p.dist=0;
    21     mark[p.x][p.y]=true;
    22     Q.push(p);
    23     while(!Q.empty()){
    24         p=Q.front();
    25         Q.pop();
    26         if(map[p.x][p.y]=='1'){
    27             return p.dist;
    28         }
    29         for(int i=0;i<4;i++){
    30             q.x=p.x+dir[i][0];
    31             q.y=p.y+dir[i][1];
    32             if(q.x<1||q.x>n||q.y<1||q.y>m||mark[q.x][q.y])continue;
    33             q.dist=p.dist+1;
    34             mark[q.x][q.y]=true;
    35             Q.push(q);
    36         }
    37     }
    38 }
    39 
    40 
    41 int main(){
    42     while(~scanf("%d%d",&n,&m)){
    43         for(int i=1;i<=n;i++)
    44             scanf("%s",map[i]+1);
    45         for(int i=1;i<=n;i++){
    46             for(int j=1;j<=m;j++){
    47                 if(map[i][j]=='1')result[i][j]=0;
    48                 else result[i][j]=bfs(i,j);
    49             }
    50         }
    51         for(int i=1;i<=n;i++){
    52             for(int j=1;j<=m;j++){
    53                 j<m?printf("%d ",result[i][j]):printf("%d\n",result[i][j]);
    54             }
    55         }
    56     }
    57     return 0;
    58 }
    View Code

    PS:最近做的几道广搜题,题目的质量都还不错,倾情奉献。

  • 相关阅读:
    I
    H
    装箱问题
    E
    Oracle创建视图(View)
    (转)Navicat Premium 12.1.8.0安装与激活
    bigdecimal 保留小数位
    用命令修改Oracle数据库密码
    sql中exists,not exists的用法
    在Orcl中通过SQL语句修改创建表
  • 原文地址:https://www.cnblogs.com/wally/p/3080961.html
Copyright © 2011-2022 走看看