HDU 1372 BFS

来源:互联网 发布:js 水球图 编辑:程序博客网 时间:2024/05/19 19:35
//getchar();忘了,纠结我好几个小时!!!!千万不能忘了!

在国际象棋中Knight称骑士Knight的走法和中国象棋中马相同,同样是走字,

或英文字母大写的L形:即先向左(或右)走1格,再向上(或下)走2格;或先向左(或右)

走2格,再向上(或下)走1格。不同的是,囯际象棋的Knight没有绊马脚的限制,故Knight可越过其

他棋子。吃子与走法相同。

如图:

#include<stdio.h>#include<string.h>#include<queue>#include<conio.h>using namespace std;int vst[17][17]; // 访问标记int dir[8][2]={1,-2,1,2,2,1,2,-1,-1,2,-1,-2,-2,1,-2,-1}; // 方向向量 int row1,row2; char col1,col2;struct State // BFS 队列中的状态数据结构{int x,y; // 坐标位置int counter; // 搜索步数统计器};int CheckState(State s) // 约束条件检验  {     if(!vst[s.x][s.y]&&s.x<8&&s.x>=0&&s.y<8&&s.y>=0) // 满足条件                  return 1;     else // 约束条件冲突       return 0;  }  int bfs(State st){int i;memset(vst,0,sizeof(vst));queue <State> q; // BFS 队列State now,next; // 定义2 个状态,当前和下一个st.counter=0; // 计数器清零q.push(st); // 入队vst[st.x][st.y]=1; // 访问标记while(!q.empty()){now=q.front(); // 取队首元素进行扩展if(now.x==(int)(col2-'a')&&now.y==row2-1) // 出现目标态,此时为Step_Counter 的最小值,可以退出即可{return now.counter;}   for(i=0;i<8;i++)   {next.x=now.x+dir[i][0]; // 按照规则生成下一个状态next.y=now.y+dir[i][1];next.counter=now.counter+1; if(CheckState(next)) // 如果状态满足约束条件则入队  {q.push(next);vst[next.x][next.y]=1; //访问标记 }   }    q.pop(); // 队首元素出队}  return 0;}int main(){//freopen("in.txt","r",stdin);  State start;  while(scanf("%c%d %c%d",&col1,&row1,&col2,&row2)!=EOF)  {  //col1=(col1-'a'+1);  //col2=(col2-'a'+1); // memset(vst,0,sizeof(vst));  //(int)col1;(int)col2;  start.x=col1-'a';      start.y=row1-1;  printf("To get from %c%d to %c%d takes %d knight moves.\n",col1,row1,col2,row2,bfs(start));  getchar();   }  return 0;}


原创粉丝点击