牛客网 2021秋季算法入门班第六章习题:搜索与搜索剪枝
1001 全排列DFS 回溯
#include1002 走出迷宫using namespace std; bool is[10] = {0} ; int path[10]; void dfs(int n){ if(n == 8){ for(int i = 0 ; i < 8 ; i ++){ cout << path[i] << " " ; } cout << endl ; } for(int i = 1 ; i <= 8 ; i ++ ){ if(!is[i]){ path[n] = i ; is[i] = true ; dfs(n + 1); is[i] = false ; } } } int main(){ dfs(0); return 0 ; }
#includeusing namespace std; int main(){ vector > direction = {{1,0},{-1,0},{0,1},{0,-1}} ; char ma[501][501] ; queue > que ; int visit[501][501] ; memset(visit, 0, sizeof(visit)); // init int n , m ; while(cin >> n >> m){ for(int i = 0 ; i < n ; i ++){ for(int j = 0 ; j < m ; j ++){ cin >> ma[i][j] ; if(ma[i][j] == 'S'){ que.push({i , j}); visit[i][j] = 1 ; } } } while(!que.empty()){ auto preque = que.front(); que.pop(); int x = preque.first , y = preque.second ; for(int i = 0 ; i < 4 ; i ++){ int prex = direction[i][0] + x , prey = direction[i][1] + y ; if(prex >= 0 && prex < n && prey >= 0 && prey < m && ma[prex][prey] == '.' && visit[prex][prey] == 0){ que.push({prex , prey}); visit[prex][prey] = 1 ; } if(ma[prex][prey] == 'E'){ cout << "Yes" << endl; } } } cout << "No" << endl; } return 0 ; }
由于有多组输入,所以用 while 输入,不然会在第一组数据回城。
过了 75% 用例
#includeusing namespace std; int main(){ vector > direction = {{1,0},{-1,0},{0,1},{0,-1}} ; char ma[501][501] ; queue > que ; int visit[501][501] ; memset(visit, 0, sizeof(visit)); // init int n , m ; while(cin >> n >> m){ int flag = 0 ; for(int i = 0 ; i < n ; i ++){ for(int j = 0 ; j < m ; j ++){ cin >> ma[i][j] ; if(ma[i][j] == 'S'){ que.push({i , j}); visit[i][j] = 1 ; } } } while(!que.empty()){ auto preque = que.front(); que.pop(); int x = preque.first , y = preque.second ; for(int i = 0 ; i < 4 ; i ++){ int prex = direction[i][0] + x , prey = direction[i][1] + y ; if(prex >= 0 && prex < n && prey >= 0 && prey < m && ma[prex][prey] == '.' && visit[prex][prey] == 0){ que.push({prex , prey}); visit[prex][prey] = 1 ; } if(ma[prex][prey] == 'E'){ flag = 1 ; } if(flag == 1) break ; } } if(flag == 1) cout << "Yes" << endl ; else cout << "No" << endl; } return 0 ; }
AC
#includeusing namespace std; char mp[501][501]; int _next[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int visit[501][501]; void init(){ memset(visit,0,sizeof(visit)); } int main(){ int n,m; while(cin>>n>>m){ int bx,by; for(int i=0;i >mp[i][j]; if(mp[i][j]=='S'){ bx=i; by=j; } } } //cout< >q; q.push(make_pair(bx,by)); visit[bx][by]=1; int flag=0; while(!q.empty()){ pair x=q.front(); q.pop(); for(int i=0;i<4;i++){ int c=x.first+_next[i][0]; int d=x.second+_next[i][1]; if(c =0&&d>=0&&mp[c][d]=='.'&&!visit[c][d]){ q.push(make_pair(c,d)); visit[c][d]=1; } if(c =0&&d>=0&&mp[c][d]=='E'){ flag=1; break; } } if(flag==1){ break; } } if(flag==1){ cout<<"Yes"<



