牛客入门题单:搜索与搜索剪枝

搜索与搜索剪枝

牛客网 2021秋季算法入门班第六章习题:搜索与搜索剪枝

1001 全排列

  • DFS 回溯
#include <bits/stdc++.h>
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 ;
}

1002 走出迷宫

#include<bits/stdc++.h>
using namespace std;

int main(){
    vector<vector<int>> direction = {{1,0},{-1,0},{0,1},{0,-1}} ;
    char ma[501][501] ;
    queue<pair<int , int>> 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% 用例
#include<bits/stdc++.h>
using namespace std;

int main(){
    vector<vector<int>> direction = {{1,0},{-1,0},{0,1},{0,-1}} ;
    char ma[501][501] ;
    queue<pair<int , int>> 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
#include <bits/stdc++.h>
using 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<n;i++){
            for(int j=0;j<m;j++){
                cin>>mp[i][j];
                if(mp[i][j]=='S'){
                    bx=i;
                    by=j;
                }
            }
        }
        //cout<<bx<<" "<<by<<endl;
        init();
        queue<pair<int,int>>q;
        q.push(make_pair(bx,by));
        visit[bx][by]=1;
        int flag=0;
        while(!q.empty()){
            pair<int,int>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<n&&d<m&&c>=0&&d>=0&&mp[c][d]=='.'&&!visit[c][d]){
                    q.push(make_pair(c,d));
                    visit[c][d]=1;
                }
                if(c<n&&d<m&&c>=0&&d>=0&&mp[c][d]=='E'){
                    flag=1;
                    break;
                }
            }  
            if(flag==1){
                break;
            }      
        }
        if(flag==1){
            cout<<"Yes"<<endl;
        }else{
            cout<<"No"<<endl;
        }
    }
     
    return 0;
}
上一篇:295. Find Median from Data Stream


下一篇:Java两个栈实现队列