P1747 好奇怪的游戏

     显然是一道广搜模板题;

   代码:

   

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstring>
 5 using namespace std;
 6 
 7 struct zkw{
 8     int x; //所在位置的横坐标 
 9     int y; //所在位置的纵坐标 
10     int d; //已走的步数 
11 };
12 zkw w;
13 
14 queue<zkw> q; // STL队列 
15 
16 int dx[13]={0,-2,-2,-1,1,2,2,2,2,1,-1,-2,-2}; // 共12个方向 
17 int dy[13]={0,1,2,2,2,2,1,-1,-2,-2,-2,-2,-1};
18 
19 bool vis[25][25]; // 标记是否走过 
20 
21 void bfs(){
22     while(!q.empty()){
23         w=q.front();
24         q.pop();
25         for(int i=0;i<13;++i){ //枚举所走的方向 
26             int xx=w.x+dx[i],yy=w.y+dy[i];
27             if(xx==1 && yy==1){ //若符合要求,停止索索,输出答案 
28                 printf("%d",w.d+1);
29                 return;
30             }
31             if(xx>=1 && xx<=20 && yy>=1 && yy<=20 && !vis[xx][yy]){ // 继续搜索 
32                 vis[xx][yy]=true;
33                 q.push((zkw){xx,yy,w.d+1});
34             }
35         }
36     }
37 }
38 
39 int main(){
40     int x,y,a,b;
41     scanf("%d%d%d%d",&x,&y,&a,&b);
42     q.push((zkw){x,y,0});
43     vis[x][y]=true;
44     bfs();
45     printf("
");
46     memset(vis,0,sizeof(vis)); //清空 
47     vis[a][b]=true;
48     while(!q.empty()){ // 清空队列,为下一次搜索做准备 
49         q.pop();
50     }
51     w=(zkw){0,0,0};
52     q.push((zkw){a,b,0});
53     bfs();
54     return 0;
55 }
原文地址:https://www.cnblogs.com/zkw666/p/13339607.html