• HDU 1372(骑士周游问题)


      1 //仍然bfs+判重 
      2 #include <iostream>
      3 #include <stdio.h>
      4 #include <cstring>
      5 #include <queue>
      6 using namespace std;
      7 typedef struct Node
      8 {
      9     int x,y;
     10     int step;
     11 }Node;
     12 Node ch[1000];
     13 bool vis[10][10];
     14 int bfs(int r1,int c1,int r2,int c2)
     15 {
     16     int i,j,k,t;
     17     memset(ch,0,sizeof(ch));
     18     memset(vis,false,sizeof(vis));
     19     ch[1].x = r1,ch[1].y = c1;
     20     ch[1].step = 0;
     21     queue <Node > q;
     22     while(!q.empty())
     23         q.pop();
     24     q.push(ch[1]);
     25     Node temp;
     26     while(!q.empty())
     27     {
     28         Node head = q.front();
     29         q.pop();
     30         //non-lvalue in assignment :等号写成了赋值号 
     31         if(head.x == r2&&head.y == c2)
     32             return head.step;
     33         else
     34         {//向八个方向搜索
     35         //忘加上界啦 
     36             int col = head.y,row = head.x;
     37             int ans = head.step;
     38             temp.step = 0;
     39             if(!vis[row-2][col-1]&&row>=3&&col>=2&&row<=8&&col<=8)
     40             {
     41                 vis[row-2][col-1] = true;
     42                 temp.x=row-2,temp.y=col-1,temp.step+=ans+1;
     43                 q.push(temp);
     44                 temp.step=0;
     45             } 
     46             if(!vis[row-1][col-2]&&row>=2&&col>=3&&row<=8&&col<=8)
     47             {
     48                 vis[row-1][col-2] = true;
     49                 temp.x=row-1,temp.y=col-2,temp.step+=ans+1;
     50                 q.push(temp);
     51                 temp.step=0;
     52             }
     53             if(!vis[row+1][col-2]&&row>=1&&col>=3&&row<=7&&col<=8)
     54             {
     55                 vis[row+1][col-2] = true;
     56                 temp.x=row+1,temp.y=col-2,temp.step+=ans+1;
     57                 q.push(temp);
     58                 temp.step=0;
     59             }
     60             if(!vis[row+2][col-1]&&row>=1&&col>=2&&row<=6&&col<=8)
     61             {
     62                 vis[row+2][col-1] = true;
     63                 temp.x=row+2,temp.y=col-1,temp.step+=ans+1;
     64                 q.push(temp);
     65                 temp.step=0;
     66             }
     67             if(!vis[row+2][col+1]&&row>=1&&col>=1&&row<=6&&col<=7)
     68             {
     69                 vis[row+2][col+1] = true;
     70                 temp.x=row+2,temp.y=col+1,temp.step+=ans+1;
     71                 q.push(temp);
     72                 temp.step=0;
     73             }
     74             if(!vis[row+1][col+2]&&row>=1&&col>=1&&row<=7&&col<=6)
     75             {
     76                 vis[row+1][col+2] = true;
     77                 temp.x=row+1,temp.y=col+2,temp.step+=ans+1;
     78                 q.push(temp);
     79                 temp.step=0;
     80             }
     81             if(!vis[row-1][col+2]&&row>=2&&col>=1&&row<=8&&col<=6)
     82             {
     83                 vis[row-1][col+2] = true;
     84                 temp.x=row-1,temp.y=col+2,temp.step+=ans+1;
     85                 q.push(temp);
     86                 temp.step=0;
     87             }
     88             if(!vis[row-2][col+1]&&row>=3&&col>=1&&row<=8&&col<=7)
     89             {
     90                 vis[row-2][col+1] = true;
     91                 temp.x=row-2,temp.y=col+1,temp.step+=ans+1;
     92                 q.push(temp);
     93                 temp.step=0;
     94             }
     95         }
     96     }
     97 }
     98 int main()
     99 {
    100     int i,j,k,t;
    101     char c11,c22;
    102     int r1,r2;
    103     while(scanf("%c%d %c%d",&c11,&r1,&c22,&r2)!=EOF)
    104     {
    105         int c1 = c11-'a'+1;//下标0不用
    106         int c2 = c22-'a'+1;//下标0不用
    107         int ans = bfs(r1,c1,r2,c2);
    108         cout<<"To get from "<<c11<<r1<<" to "<<c22<<r2<<" takes "<<ans<<" knight moves."<<endl;
    109         getchar();
    110     }
    111     return 0;
    112 }
    113 
    114 
    115          
    116         
    117         
     1 //网上的 
     2 #include <iostream>
     3 #include <queue>
     4 using namespace std;
     5 struct Node
     6 {
     7     int c;
     8     int r;
     9     int lev;
    10 };
    11 queue <Node> Q;
    12 int a[] = {0,-2,-2,-1,-1,1,1,2,2};
    13 int b[] = {0,-1,1,-2,2,-2,2,-1,1};
    14 int GetRe(Node s,Node e)
    15 {
    16     int n = 0,i;
    17     while(!Q.empty())
    18         Q.pop();
    19     if(e.c == s.c && e.r == s.r)
    20         return 0;
    21     Q.push(s);
    22     Node front;
    23     Node tmp;
    24     while(!Q.empty())
    25     {
    26         front = Q.front();
    27         Q.pop();
    28         for(i = 1; i <= 8; i ++)
    29         {
    30             tmp.c = b[i] + front.c;
    31             tmp.r = a[i] + front.r;
    32             tmp.lev = front.lev + 1;
    33             if(e.c == tmp.c && e.r == tmp.r)
    34                 return tmp.lev;
    35             if(tmp.c >= 1 && tmp.c <= 8 && tmp.r >= 1 && tmp.r <= 8)
    36                 Q.push(tmp);
    37         }
    38     }
    39 
    40 }
    41 int main()
    42 {
    43     char s[3],e[3];
    44     Node start,end;
    45     while(cin >> s >> e)
    46     {
    47         start.c = s[0] - 'a' + 1;
    48         start.r = s[1] - '0';
    49         start.lev = 0;
    50         end.c = e[0] - 'a' + 1;
    51         end.r = e[1] - '0';
    52         cout<<"To get from "<<s<<" to "<<e<<" takes "<<GetRe(start,end)<<" knight moves."<<endl;
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    自定义轮播图、自定义集合控件的实现
    推荐一个比较好用的工具
    博客迁移至简书
    ReactiveCocoa学习资料
    Xcode常用快捷键
    iOS自定义字体
    cocoapod的安装与使用
    iOS开发笔记
    UIWebView的三种加载方式
    项目常用第三方库
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2649040.html
Copyright © 2020-2023  润新知