• Knight Moves


    poj2243:http://poj.org/problem?id=2243

    题意:给定象棋棋盘上的两个位置a,b,计算马从a到b所需要的步数的最小值。
    题解:把整个棋盘看成一个二维的图,a,b相当于两个点,然后做bfs即可

      1 #include<iostream>
      2 #include<cstring>
      3 #include<cstdio>
      4 #include<algorithm>
      5 #include<queue>
      6 using namespace std;
      7 struct Node{
      8  int x;
      9  int y;
     10  int step;
     11 }; //记录当前节点的坐标以及到起点的步数
     12 
     13 int map[9][9]; //记录地图
     14 int sx,sy,dx,dy;//记录起点和目标的坐标
     15 int mit[10][10]; //mit【i】【j】,记录i,j的点到起点的最小步数。
     16 int bfs(){
     17      queue<Node> Q;
     18       Node temp;
     19       temp.x=sx;
     20       temp.y=sy;
     21       temp.step=0;
     22     Q.push(temp);
     23     while(!Q.empty()){
     24       Node tmp;
     25       tmp=Q.front();
     26       Q.pop();
     27       int xx=tmp.x;
     28       int yy=tmp.y; //以下从当前节点向周围8个方向进行收索
     29       if(xx-2>=1&&yy+1<=8&&tmp.step+1<mit[xx-2][yy+1]){
     30               mit[xx-2][yy+1]=tmp.step+1;  //如果到下一个节点的步数小于以前已经记录的值
     31               Node tt;                 //注意边界的处理
     32               tt.x=xx-2;
     33               tt.y=yy+1;
     34               tt.step=tmp.step+1;
     35               Q.push(tt);
     36         }
     37         if(xx-1>=1&&yy+2<=8&&tmp.step+1<mit[xx-1][yy+2]){
     38               mit[xx-1][yy+2]=tmp.step+1;
     39               Node tt;
     40               tt.x=xx-1;
     41               tt.y=yy+2;
     42               tt.step=tmp.step+1;
     43               Q.push(tt);
     44         }
     45          if(xx+1<=8&&yy+2<=8&&tmp.step+1<mit[xx+1][yy+2]){
     46               mit[xx+1][yy+2]=tmp.step+1;
     47               Node tt;
     48               tt.x=xx+1;
     49               tt.y=yy+2;
     50               tt.step=tmp.step+1;
     51               Q.push(tt);
     52         }
     53          if(xx+2<=8&&yy+1<=8&&tmp.step+1<mit[xx+2][yy+1]){
     54               mit[xx+2][yy+1]=tmp.step+1;
     55               Node tt;
     56               tt.x=xx+2;
     57               tt.y=yy+1;
     58               tt.step=tmp.step+1;
     59               Q.push(tt);
     60         }
     61            if(xx+2<=8&&yy-1>=1&&tmp.step+1<mit[xx+2][yy-1]){
     62               mit[xx+2][yy-1]=tmp.step+1;
     63               Node tt;
     64               tt.x=xx+2;
     65               tt.y=yy-1;
     66               tt.step=tmp.step+1;
     67               Q.push(tt);
     68         }
     69           if(xx+1<=8&&yy-2>=1&&tmp.step+1<mit[xx+1][yy-2]){
     70               mit[xx+1][yy-2]=tmp.step+1;
     71               Node tt;
     72               tt.x=xx+1;
     73               tt.y=yy-2;
     74               tt.step=tmp.step+1;
     75               Q.push(tt);
     76         }
     77          if(xx-1>=1&&yy-2>=1&&tmp.step+1<mit[xx-1][yy-2]){
     78               mit[xx-1][yy-2]=tmp.step+1;
     79               Node tt;
     80               tt.x=xx-1;
     81               tt.y=yy-2;
     82               tt.step=tmp.step+1;
     83               Q.push(tt);
     84         }
     85         if(xx-2>=1&&yy-1>=1&&tmp.step+1<mit[xx-2][yy-1]){
     86               mit[xx-2][yy-1]=tmp.step+1;
     87               Node tt;
     88               tt.x=xx-2;
     89               tt.y=yy-1;
     90               tt.step=tmp.step+1;
     91               Q.push(tt);
     92         }
     93 
     94 
     95 
     96     }
     97      return mit[dx][dy];
     98 
     99 }
    100 int main(){
    101     char s1[3];
    102     char s2[3];
    103 while(~scanf("%s %s",s1,s2)){//读取两个字符
    104     for(int i=1;i<=8;i++)
    105       for(int j=1;j<=8;j++){
    106       mit[i][j] =10000000; //这里记住初始化,memset不管用
    107       }
    108      sy=s1[0]-96;//小写字母转化成数字
    109      sx=s1[1]-48;//数字字符转化成int类型的数字
    110      dy=s2[0]-96;
    111      dx=s2[1]-48;
    112      mit[sx][sy]=0;//初始化
    113     int ans=bfs();
    114      printf("To get from %s to %s takes %d knight moves.
    ",s1,s2,ans);
    115 }
    116 }
    View Code
  • 相关阅读:
    Javascript高级编程学习笔记(32)—— 客户端检测(1)能力检测
    Javascript高级编程学习笔记(31)—— BOM(5)screen、history对象
    Javascript高级编程学习笔记(30)—— BOM(4)navigator对象
    Javascript高级编程学习笔记(29)—— BOM(3)location对象
    Javascript高级编程学习笔记(28)—— BOM(2)window对象2
    Javascript高级编程学习笔记(27)—— BOM(1)window对象1
    逆向与反汇编工具
    Silicon Labs
    sk_buff 里的len, data_len, skb_headlen
    IP分片重组的分析和常见碎片攻击 v0.2
  • 原文地址:https://www.cnblogs.com/chujian123/p/3366447.html
Copyright © 2020-2023  润新知