1. 程式人生 > 其它 >洛谷馬的遍歷

洛谷馬的遍歷

題目連結:https://www.luogu.com.cn/problem/P1443

馬走日字象走田,究竟怎麼走呢?

畫畫圖就明白啦,

除此之外,這個題就是一道稍微變形的bfs題目,需要注意的是,左對齊輸出一定要有,否則你即使是執行結果對了也怎麼都是WA,別問,說多了都是淚

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,sx,sy;
 4 int dis[410][410];
 5 int dir[8][2]={
 6     {-2,-1},
 7     {-2,1},
 8     {-1,2},
 9     {1
,2}, 10 {2,1}, 11 {2,-1}, 12 {1,-2}, 13 {-1,-2} 14 };//為什麼這樣設座標請看上圖 15 struct node 16 { 17 int x; 18 int y; 19 }; 20 #define CHECK(x,y)(x>=1&&x<=n&&y>=1&&y<=m)//邊界條件改為1了,因為馬走日子 21 void bfs(int x,int y) 22 { 23 dis[x][y]=0; //標記走過 24 queue<node>q;
25 node start,next; 26 start.x=x; 27 start.y=y; 28 q.push(start); 29 while(!q.empty()) 30 { 31 start=q.front(); 32 q.pop(); 33 for(register int i=0;i<8;i++) 34 { 35 next.x=start.x+dir[i][0]; 36 next.y=start.y+dir[i][1];
37 if(CHECK(next.x,next.y)&&dis[next.x][next.y]==-1) 38 { 39 dis[next.x][next.y]=0;//標記 40 dis[next.x][next.y]=dis[start.x][start.y]+1;//下一個方位,步數是父節點+1 41 q.push(next);//下一個 42 } 43 } 44 } 45 } 46 int main() 47 { 48 ios::sync_with_stdio(false); 49 cin>>n>>m>>sx>>sy; 50 for(register int i=1;i<=n;i++) 51 for(register int j=1;j<=m;j++) 52 dis[i][j]=-1;//先將所以元素都覆蓋為-1 53 bfs(sx,sy);//bfs 54 for(register int i=1;i<=n;i++) 55 { 56 for(register int j=1;j<=m;j++) 57 { 58 cout<<left<<setw(5)<<dis[i][j];//左對齊輸出場寬為5 59 } 60 cout<<endl; 61 } 62 63 return 0; 64 }

這裡提供一下bfs和dfs的一些相關小知識:

bfs模板:

 1 int dir[4][2]= {0,1,0,-1,1,0,-1,0}; // 方向向量
 2 struct State // BFS 佇列中的狀態資料結構
 3 {
 4     int x,y; // 座標位置
 5     int Step_Counter; // 搜尋步數統計器
 6 };
 7 State a[maxn];
 8 
 9 bool CheckState(State s) // 約束條件檢驗
10 {
11     if(!used[s.x][s.y] && ...) // 邊界或未被標記
12         return true;
13     else // 約束條件衝突
14         return false;
15 }
16 
17 void bfs(State st)
18 {
19     queue <State> q; // BFS 佇列
20     State now,next; // 定義2 個狀態,當前和下一個
21     q.push(st); // 入隊
22     used[st.x][st.y]=false; // 訪問標記
23     while(!q.empty())//當佇列不為空時
24     {
25         now=q.front(); // 取隊首元素進行擴充套件
26         if(now==G) //
27         {
28             ...... // 做相關處理
29             return;
30         }
31         for(int i=0; i<4; i++)
32         {
33             next.x=now.x+dir[i][0]; // 按照規則生成下一個狀態
34             next.y=now.y+dir[i][1];
35             if(CheckState(next)) // 如果狀態滿足約束條件則入隊
36             {
37                 q.push(next);//入隊
38                 used[next.x][next.y]=false; //訪問標記
39             }
40         }
41         q.pop(); // 隊首元素出隊
42     }
43 }