1. 程式人生 > 實用技巧 >P1747 好奇怪的遊戲

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("\n"); 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 }