洛谷馬的遍歷
阿新 • • 發佈:2022-03-19
題目連結: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 }