1. 程式人生 > >noip 01迷宮(BFS+記憶化)

noip 01迷宮(BFS+記憶化)

一個 col using char rst clu tps str show

題目鏈接:https://www.luogu.org/problem/show?pid=1141

題意:給出一個僅由數字0與1組成的n×n格迷宮。放0的那一格可以4個方向走到放1那一格,1也是四個方向走到放0的那一格。算上本身的那格。求最多能移動多少格子。

數據比較大,如果直接用bfs搜的話會暴時。所以需要每次搜索完都記錄一下。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <queue>
 4 using namespace std;
 5 
 6 const int
maxn=1111; 7 typedef pair<int,int> P; 8 9 char maze[maxn][maxn]; 10 int vis[maxn][maxn]; 11 long long ans[maxn*maxn]; 12 int dx[4]={1,-1,0,0}; 13 int dy[4]={0,0,1,-1}; 14 int n,m; 15 16 int bfs(int turn,int sx,int sy){ 17 queue <P> que; 18 P p; 19 20 que.push(P(sx,sy));
21 vis[sx][sy]=turn; 22 23 long long cnt=0; 24 while(que.size()){ 25 p=que.front();que.pop(); 26 cnt++; 27 for(int i=0;i<4;i++){ 28 int nx=p.first+dx[i],ny=p.second+dy[i]; 29 if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&maze[nx][ny]!=maze[p.first][p.second]&&vis[nx][ny]==0
){ 30 que.push(P(nx,ny)); 31 vis[nx][ny]=turn; 32 } 33 } 34 } 35 return cnt; 36 } 37 38 int main(){ 39 int sx,sy; 40 cin>>n>>m; 41 for(int i=1;i<=n;i++) 42 for(int j=1;j<=n;j++) 43 cin>>maze[i][j]; 44 45 //每一次訪問過的點,他們能遍歷的最多格子是一樣的.記憶化一下. 46 for(int i=1;i<=m;i++){ 47 cin>>sx>>sy; 48 if(!vis[sx][sy]) {ans[i]=bfs(i,sx,sy);cout<<ans[i]<<endl;} 49 else {ans[i]=ans[vis[sx][sy]];cout<<ans[i]<<endl;} 50 } 51 return 0; 52 }

noip 01迷宮(BFS+記憶化)