标签:empty map 剪枝 遍历 mes 就是 main continue std
首先声明,DFS可以拿满分,BFS只能拿一半分。现在不想BFS了,着手模拟吧
这道没做出来的BFS,其实让我收获很大很大!!!让我明白回溯,剪枝,DFS,BFS的区别。
对于寻找路径问题,就是用DFS或BFS。
找出所有路径,那么就需要DFS和回溯了。注意在回溯过程中,要修改遍历和未遍历的状态
寻找最短,最大,那就是DFS、剪枝、回溯了。剪枝,顾名思义,就是减去搜索树中不符合要求的部分,简单来说就是做下一步时进行判断,我下一步合不合理。(接着走是否是最小呢?之类的)
注意检查的是新坐标!!!
1 #include<bits/stdc++.h> 2 using namespace std; 3 int sx,sy,ex,ey; 4 int maps[6][6]; 5 int dir[4][2]={ 6 {0,1}, 7 {1,0}, 8 {0,-1}, 9 {-1,0} 10 }; 11 int n,m; 12 int num=0; 13 bool check(int x,int y) 14 { 15 return x>=1&&x<=n&&y>=1&&y<=n&&maps[x][y]==1; 16 } 17 void dfs(int x,int y) 18 { 19 if(x==ex&&y==ey){ 20 num++; 21 return; 22 } 23 maps[x][y]=0; 24 for(int i=0;i<4;i++){ 25 if(check(x+dir[i][0],y+dir[i][1])){ 26 dfs(x+dir[i][0],y+dir[i][1]); 27 } 28 } 29 maps[x][y]=1; 30 } 31 int main() 32 { 33 int t; 34 cin>>n>>m>>t; 35 for(int i=1;i<=n;i++){ 36 for(int j=1;j<=m;j++){ 37 maps[i][j]=1;//1表示可通过 38 } 39 } 40 cin>>sx>>sy>>ex>>ey; 41 for(int i=0;i<t;i++){ 42 int x,y; 43 cin>>x>>y; 44 maps[x][y]=0; 45 } 46 dfs(sx,sy); 47 cout<<num; 48 return 0; 49 }
#include<bits/stdc++.h> using namespace std; int sx,sy,ex,ey; int maps[6][6]; int dir[4][2]={ {0,1}, {1,0}, {0,-1}, {-1,0} }; int n,m; int num=0; bool check(int x,int y) { return x>=1&&x<=n&&y>=1&&y<=n&&maps[x][y]==1; } struct node{int x,y;}; void bfs() { queue<node> q; node nownode; nownode.x=sx; nownode.y=sy; q.push(nownode); while(!q.empty()){ nownode=q.front(); q.pop(); if(nownode.x==ex&&nownode.y==ey){ num++; continue; } maps[nownode.x][nownode.y]=0; for(int i=0;i<4;i++){ node nextnode; int next_x=nownode.x+dir[i][0]; int next_y=nownode.y+dir[i][1]; if(check(next_x,next_y)){ nextnode.x=next_x; nextnode.y=next_y; q.push(nextnode); } } maps[nownode.x][nownode.y]=1; } } int main() { int t; cin>>n>>m>>t; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ maps[i][j]=1;//1表示可通过 } } cin>>sx>>sy>>ex>>ey; for(int i=0;i<t;i++){ int x,y; cin>>x>>y; maps[x][y]=0; } bfs(); cout<<num; return 0; }
标签:empty map 剪枝 遍历 mes 就是 main continue std
原文地址:https://www.cnblogs.com/lvjt0208/p/14629861.html