• HDU1175 + HDU1728+BFS转弯


    两题基本相同

    都是关于转弯不能超过某个数,所以有些点可能重复走,所以要设time[][]数组来记录上次走过的时间!!!!

    记得初始化queue!!!

    HDU1175

    View Code
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 #include<queue>
     5 #include<algorithm>
     6 using namespace std;
     7 const int dx[]={0,0,1,-1};
     8 const int dy[]={1,-1,0,0};
     9 const int maxn = 1005;
    10 const int inf = 12345;
    11 int mat[ maxn ][ maxn ],time[ maxn ][ maxn ];
    12 struct node{
    13     int x,y;
    14 }s,e;
    15 struct node2{
    16     int x,y,t,dir;
    17 }p,pp;
    18 queue<node2>q;
    19 void init(){
    20     memset( mat,0,sizeof( mat ) );
    21 }
    22 int n,m;
    23 int out( int x,int y ){
    24     if( x<0||x>=n||y<0||y>=m )
    25         return 1;
    26     else
    27         return -1;
    28 }
    29 bool bfs(){
    30     for( int i=0;i<n;i++ )
    31         for( int j=0;j<m;j++ )
    32             time[i][j]=inf;
    33     p.x=s.x,p.y=s.y,p.t=0,p.dir=-1;
    34     time[ s.x ][ s.y ]=0;
    35     q.push( p );
    36     while( !q.empty() ){
    37         p=q.front(),q.pop();
    38         //printf("front:%d %d t:%d\n",p.x,p.y,p.t);
    39         if( p.t>2 )
    40             continue;//return false;
    41         if( p.x==e.x&&p.y==e.y )
    42             return true;
    43         for( int i=0;i<4;i++ ){
    44             pp.x=p.x+dx[i];
    45             pp.y=p.y+dy[i];
    46             pp.dir=i;
    47             pp.t=p.t;
    48             if( p.dir==-1 ){
    49                 pp.t=p.t;
    50             }
    51             else if( pp.dir!=p.dir ){
    52                 pp.t=p.t+1;
    53             }
    54             if( out( pp.x,pp.y )==1 )
    55                 continue;
    56             if( time[ pp.x ][ pp.y ]>pp.t&&( (pp.x==e.x&&pp.y==e.y)||mat[pp.x][pp.y]==0 ) ){
    57                 time[ pp.x ][ pp.y ]=pp.t;
    58                 //printf("%d %d t:%d\n",pp.x,pp.y,pp.t);
    59                 q.push( pp );
    60             }
    61         }
    62     }
    63     return false;
    64 }
    65 int main(){
    66     while( scanf("%d%d",&n,&m)==2,n+m ){
    67         init();
    68         for( int i=0;i<n;i++ )
    69             for( int j=0;j<m;j++ )
    70                 scanf("%d",&mat[i][j]);
    71         int num;
    72         scanf("%d",&num);
    73         while( num-- ){
    74              while( !q.empty() )
    75                 q.pop();
    76             scanf("%d%d%d%d",&s.x,&s.y,&e.x,&e.y);
    77             s.x--,s.y--,e.x--,e.y--;
    78             if( s.x==e.x&&s.y==e.y ){
    79                 printf("NO\n");
    80                 continue;
    81             }
    82             if( mat[s.x][s.y]==0||mat[e.x][e.y]==0||mat[s.x][s.y]!=mat[e.x][e.y] ){
    83                 printf("NO\n");
    84                 continue;
    85             }
    86             if( bfs()==true ){
    87                 printf("YES\n");
    88             }
    89             else{
    90                 printf("NO\n");
    91             }
    92         }
    93     }
    94     return 0;
    95 }

    HDU1728

    View Code
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<queue>
     5 #include<iostream>
     6 using namespace std;
     7 struct point{
     8     int x,y,dir,step;
     9 };
    10 const int N=105;
    11 const int MAX=999999;
    12 const int dx[]={1,-1,0,0};
    13 const int dy[]={0,0,1,-1};
    14 char map[N][N];
    15 int time[N][N];
    16 int sx1,sy1,sx2,sy2,m,n,ans,tmp;
    17 queue<point>q;
    18 
    19 void bfs(){
    20     int i,j,k;
    21     point p,pp;
    22     if(sx1==sx2&&sy1==sy2){
    23         ans=0;
    24         return ;
    25     }//特殊情况1
    26     while(!q.empty())
    27         q.pop();
    28 
    29     p.x=sx1;
    30     p.y=sy1;
    31     p.dir=-1;
    32     p.step=0;
    33     q.push(p);
    34     time[p.x][p.y]=0;//init
    35 
    36     while(!q.empty()){
    37         p=q.front();
    38         q.pop();
    39         if(p.x==sx2&&p.y==sy2&&ans>p.step){
    40             ans=p.step;
    41         }
    42         for(i=0;i<4;i++){
    43             pp=p;
    44             pp.x+=dx[i];
    45             pp.y+=dy[i];
    46             if(pp.x<0||pp.x>=m||pp.y<0||pp.y>=n||map[pp.x][pp.y]=='*')
    47                 continue;
    48             if(pp.dir!=-1&&pp.dir!=i){
    49                 pp.step=p.step+1;
    50             }//方向变了
    51             if(pp.step>tmp)continue;
    52             if(time[pp.x][pp.y]>=pp.step){
    53                 pp.dir=i;
    54                 time[pp.x][pp.y]=pp.step;
    55                 q.push(pp);
    56             }
    57         }
    58     }
    59     //printf("no\n");
    60     return ;
    61 }
    62 
    63 int main(){
    64     int i,j,k,t;
    65     scanf("%d",&t);
    66     while(t--){
    67         scanf("%d%d",&m,&n);
    68         getchar();
    69         for(i=0;i<m;i++){
    70             scanf("%s",map[i]);
    71             getchar();
    72         }
    73         /*for(i=1;i<=m;i++)
    74             for(j=1;j<=n;j++){
    75                 cin>>map[i][j];
    76                 time[i][j]=MAX;
    77             }*/
    78         scanf("%d%d%d%d%d",&tmp,&sy1,&sx1,&sy2,&sx2);
    79         sy1--;sx1--;sy2--;sx2--;
    80         for(i=0;i<m;i++)
    81             for(j=0;j<n;j++)
    82                 time[i][j]=MAX;
    83         ans=MAX;
    84         bfs();
    85         if(ans<=tmp){
    86             printf("yes\n");
    87         }
    88         else
    89             printf("no\n");
    90     }
    91     return 0;
    92 }
    keep moving...
  • 相关阅读:
    Git 常用命令大全-转载
    Powershell重命名文件夹
    C#使用qq邮箱发送邮件
    iOS开发-YUV颜色格式
    iOS开发小记(十一)
    iOS开发-AFNetworking
    iOS开发-NSURLSession
    iOS开发-类的加载load函数和initialize函数
    iOS开发-调试(debug)
    iOS开发-graphics
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2912780.html
Copyright © 2020-2023  润新知