zoukankan      html  css  js  c++  java
  • scau实验题 8600 骑士周游问题(有障碍物)

    简单骑士周游问题,BFS,有障碍物,(可能存在无障碍物的情况),起点和终点不会相同,起点终点无障碍物

    若能从起点出发到终点则输出步数,否者输入不能到达

    #include <stdio.h>
    #include <string.h>
    #include <queue>
    #define N 70
    using namespace std;
    bool g[N][N];
    int b;
    int start,end;
    struct node
    {
        int n,r,c,k;
    };
    queue<struct node> q;
    
    int BFS()
    {
        int ans,i,k,R[10],C[10],FIND;
        struct node tmp;
        while(!q.empty()) q.pop();
        tmp.n=start;
        tmp.r=(start%8)==0 ? start/8 : start/8+1;
        tmp.c=(start%8)==0 ? 8: start%8;
        tmp.k=0;
        q.push(tmp);
        FIND=0;
        while(!q.empty())
        {
            tmp=q.front();  k=tmp.k; q.pop();
            R[1]=tmp.r-2; C[1]=tmp.c-1;
            R[2]=tmp.r-2; C[2]=tmp.c+1;
            R[3]=tmp.r-1; C[3]=tmp.c+2;
            R[4]=tmp.r+1; C[4]=tmp.c+2;
            R[5]=tmp.r+2; C[5]=tmp.c+1;
            R[6]=tmp.r+2; C[6]=tmp.c-1;
            R[7]=tmp.r+1; C[7]=tmp.c-2;
            R[8]=tmp.r-1; C[8]=tmp.c-2;
    
            for(i=1; i<=8; i++)
            {
                if(R[i]>=1 && R[i]<=8 && C[i]>=1 && C[i]<=8 && !g[R[i]][C[i]])
                {
                    tmp.n=(R[i]-1)*8+C[i];
                    tmp.r=R[i]; tmp.c=C[i];
                    tmp.k=k+1;
                    q.push(tmp);
                    if(tmp.n==end) break;
                }
            }
            if(i<=8) {FIND=1; ans=tmp.k; break;}
        }
        return FIND==1 ? ans : -1;
        
    }
    int main()
    {
        int i,j,r,c,T=0,ans;
        char s1[5],s2[5];
        while(scanf("%d",&b)!=EOF && b!=-1)
        {
            T++;
            memset(g,0,sizeof(g));
            for(i=1; i<=b; i++)
            {
                scanf("%s",s1);  //读入全部的障碍物并在图上标记
                c=s1[0]-'a'+1;
                r=s1[1]-'0';
                g[r][c]=1;  
            }
            scanf("%s",s1);  scanf("%s",s2);
            c=s1[0]-'a'+1;     r=s1[1]-'0';   start=(r-1)*8+c;
            c=s2[0]-'a'+1;   r=s2[1]-'0';   end=(r-1)*8+c;
    /*
            for(i=1; i<=8; i++)
            {
                for(j=1; j<=8; j++)
                    printf("%d ",g[i][j]);
                printf("\n");
            }
            printf("start=%d   end=%d\n",start,end);
    */
            ans=BFS();
            if(ans==-1) printf("Board %d:not reachable\n",T);
            else
            printf("Board %d:%d moves\n",T,ans);
        }
    
        return 0;
    }
  • 相关阅读:
    English,The Da Vinci Code, Chapter 23
    python,meatobject
    English,The Da Vinci Code, Chapter 22
    English,The Da Vinci Code, Chapter 21
    English,The Da Vinci Code, Chapter 20
    English,The Da Vinci Code, Chapter 19
    python,xml,ELement Tree
    English,The Da Vinci Code, Chapter 18
    English,The Da Vinci Code, Chapter 17
    English,The Da Vinci Code, Chapter 16
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2740730.html
Copyright © 2011-2022 走看看