--- tags: Coding --- # 做過的題目 ## c124: 00532 - Dungeon Master (bfs) ### 想法一(失敗) 用遞迴好像會變成dfs的方式,結果就tle了。 ```cpp= #include<bits/stdc++.h> using namespace std; int cnt=0; int l,r,c; int end_distance=0; void bfs(vector<vector<vector<char>>>maze,vector<vector<vector<int>>>&d,int z,int y,int x){ if(z>=0 && z<l && y>=0 && y<r && x>=0 && x<c){ char now=maze[z][y][x]; if(now=='#')return; if(now=='E'){ end_distance=d[z][y][x]; return; } if(z+1<l && maze[z+1][y][x]!='#' && d[z+1][y][x]==0){ d[z+1][y][x]=d[z][y][x]+1; bfs(maze,d,z+1,y,x); } if(z>0 && maze[z-1][y][x]!='#' && d[z-1][y][x]==0){ d[z-1][y][x]=d[z][y][x]+1; bfs(maze,d,z-1,y,x); } if(x<c-1 && d[z][y][x+1]==0){ d[z][y][x+1]+=d[z][y][x]+1; bfs(maze,d,z,y,x+1); } if(y<r-1 && d[z][y+1][x]==0){ d[z][y+1][x]+=d[z][y][x]+1; bfs(maze,d,z,y+1,x); } if(x>0 && d[z][y][x-1]==0){ d[z][y][x-1]+=d[z][y][x]+1; bfs(maze,d,z,y,x-1); } if(y>0 && d[z][y-1][x]==0){ d[z][y-1][x]+=d[z][y][x]+1; bfs(maze,d,z,y-1,x); } } return; } int main(){ int sl,sr,sc;//start l,start r,start c while(cin>>l>>r>>c){ if(l==0 && r==0 && c==0)break; vector<vector<vector<char>>>maze(l); vector<vector<vector<int>>>d(l); for(int i=0;i<l;i++){ maze[i].resize(r); d[i].resize(r); } for(int i=0;i<l;i++){ for(int j=0;j<r;j++){ d[i][j].resize(c,0); for(int k=0;k<c;k++){ char a; cin>>a; maze[i][j].push_back(a); if(a=='S'){ sl=i; sr=j; sc=k; } } } } bfs(maze,d,sl,sr,sc); if(end_distance)cout<<"Escaped in "<<end_distance<<" minute(s)."<<endl; else cout<<"Trapped!"<<endl; end_distance=0; } return 0; } ``` ### 想法二 想法一改成用queue就可以先丟進去的座標最先被搜尋。 ```cpp= #include<bits/stdc++.h> using namespace std; int l,r,c; int end_distance=0; int sl,sr,sc;//start l,start r,start c int el,er,ec;//end l,end r,end c struct pos{ int z,y,x; }; void debug(vector<vector<vector<int>>>vec){ for(auto i:vec){ for(auto j:i){ for(auto k:j)cout<<k; cout<<endl; } cout<<endl; } cout<<endl; } void bfs(vector<vector<vector<int>>>maze,vector<vector<vector<int>>>&d,vector<vector<vector<int>>>&color){ queue<pos>q; pos p={sl,sr,sc}; q.push(p); while(!q.empty()){ pos now=q.front(); int z=now.z , y=now.y , x=now.x; color[z][y][x]=1; pos obj; if(now.z==el && now.y==er && now.x==ec){ end_distance=d[z][y][x]; return; } if(x+1<c){ if(maze[z][y][x+1]!=0 && color[z][y][x+1]==0 && x+1<c){ obj=now; obj.x++; d[z][y][x+1]+=d[z][y][x]+1; color[z][y][x+1]=1; q.push(obj); } } if(x>0){ if(maze[z][y][x-1]!=0 && color[z][y][x-1]==0){ obj=now; obj.x--; d[z][y][x-1]+=d[z][y][x]+1; color[z][y][x-1]=1; q.push(obj); } } if(y+1<r){ if(maze[z][y+1][x]!=0 && color[z][y+1][x]==0){ obj=now; obj.y++; d[z][y+1][x]+=d[z][y][x]+1; color[z][y+1][x]=1; q.push(obj); } } if(y>0){ if(maze[z][y-1][x]!=0 && color[z][y-1][x]==0){ obj=now; obj.y--; d[z][y-1][x]+=d[z][y][x]+1; color[z][y-1][x]=1; q.push(obj); } } if(z+1<l){ if(maze[z+1][y][x]!=0 && color[z+1][y][x]==0){ obj=now; obj.z++; d[z+1][y][x]+=d[z][y][x]+1; color[z+1][y][x]=1; q.push(obj); } } if(z>0){ if(maze[z-1][y][x]!=0 && color[z-1][y][x]==0){ obj=now; obj.z--; d[z-1][y][x]+=d[z][y][x]+1; color[z-1][y][x]=1; q.push(obj); } } q.pop(); } return; } int main(){ while(cin>>l>>r>>c){ //l(z) r(y) c(x) if(l==0 && r==0 && c==0)break; vector<vector<vector<int>>>maze(l); vector<vector<vector<int>>>d(l); vector<vector<vector<int>>>color(l); for(int i=0;i<l;i++){ maze[i].resize(r); d[i].resize(r); color[i].resize(r); } for(int i=0;i<l;i++){ for(int j=0;j<r;j++){ d[i][j].resize(c,0); color[i][j].resize(c,0); for(int k=0;k<c;k++){ char a; cin>>a; if(a=='S'){ sl=i; sr=j; sc=k; maze[i][j].push_back(2); } if(a=='E'){ el=i; er=j; ec=k; maze[i][j].push_back(3); } if(a=='.')maze[i][j].push_back(1); if(a=='#')maze[i][j].push_back(0); } } } bfs(maze,d,color); if(end_distance)cout<<"Escaped in "<<end_distance<<" minute(s)."<<endl; else cout<<"Trapped!"<<endl; end_distance=0; } return 0; } ``` ## uva 11240 https://zerojudge.tw/ShowProblem?problemid=k217 求最大長度子序列 這題乍看要用dp解,但實則只要簡單判斷就好 ```cpp= #include <bits/stdc++.h> #define int long long using namespace std; int arr[500005]; signed main() { int n; cin >> n; while (n--) { int m, sum = 1; cin >> m; for (int i = 0; i < m; i++) { cin >> arr[i]; } int flag = 1; for (int i = 1; i < m; i++) { if (flag == 1 && arr[i - 1] > arr[i]) { sum++; flag = 0; } else if (flag == 0 && arr[i - 1] < arr[i]) { sum++; flag = 1; } } cout << sum << endl; } return 0; } ```