Acwing 搜索进阶打卡

1097. 池塘计数

https://www.acwing.com/problem/content/1099/

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1005;
char a[N][N];
int n,m;
int ans;
int dx[]={0,0,1,-1,1,1,-1,-1};
int dy[]={1,-1,0,0,-1,1,-1,1};
void dfs(int x,int y){
    a[x][y]='.';
    for(int i=0;i<8;i++){
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx>=1 && nx<=n && ny>=1 && ny<=m && a[nx][ny]=='W'){
            dfs(nx,ny);
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='W'){
                ans++;
                dfs(i,j);
            }
        }
    }
    cout<<ans<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

1076. 迷宫问题

https://www.acwing.com/problem/content/1078/

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef pair<int,int>PII;
const int N=1005;
int a[N][N];
PII pre[N][N];//记录上一个走过来的值
int n;
queue<PII>q;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
void bfs(){
    memset(pre,-1,sizeof pre);
    pre[n-1][n-1]={0,0};
    q.push({n-1,n-1});
    while(q.size()){
        auto t=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int nx=t.x+dx[i];
            int ny=t.y+dy[i];
            if(nx<0 ||nx>=n || ny<0 || ny>=n) continue;
            if(a[nx][ny]) continue;
            if(pre[nx][ny].x!=-1) continue;
            q.push({nx,ny});
            pre[nx][ny]={t.x,t.y};
        }
    }
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>a[i][j];
        }
    }
    bfs();
    PII end={0,0};
    while(1){
        cout<<end.x<<" "<<end.y<<endl;
        if(end.x==n-1 && end.y==n-1) break;
        end=pre[end.x][end.y];
    }
  return 0;
}
//  freopen("testdata.in", "r", stdin);

1107. 魔板

https://www.acwing.com/problem/content/1109/

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
char g[2][4];
string start="12345678";
string endstring;
unordered_map<string,int>dist;
unordered_map<string, pair<char, string>> pre;
void set(string s){
    for(int i=0;i<4;i++) g[0][i]=s[i];
    for(int i=7,j=0;j<4;i++,j--) g[1][j]=s[i];
}
string get(){
    string res;
    for (int i = 0; i < 4; i ++ ) res += g[0][i];
    for (int i = 3; i >= 0; i -- ) res += g[1][i];
    return res;
}
string fun1(string s){
    set(s);
    for (int i = 0; i < 4; i ++ ) swap(g[0][i], g[1][i]);
    return get();
}
string fun2(string s){
    set(s);
    int v0 = g[0][3], v1 = g[1][3];
    for (int i = 3; i >= 0; i -- )
    {
        g[0][i] = g[0][i - 1];
        g[1][i] = g[1][i - 1];
    }
    g[0][0] = v0, g[1][0] = v1;
    return get();
}
string fun3(string s){
    set(s);
    int v = g[0][1];
    g[0][1] = g[1][1];
    g[1][1] = g[1][2];
    g[1][2] = g[0][2];
    g[0][2] = v;
    return get();
}
int bfs(){
    if(start==endstring) return 0;
    queue<string>q;
    q.push(start);
    dist[start]=0;
    while(q.size()){
        string t=q.front();
        q.pop();
        string m[3];
        m[0]=fun1(t);
        m[1]=fun2(t);
        m[2]=fun3(t);
        for(int i=0;i<3;i++){
            if(!dist.count(m[i])){
                dist[m[i]]=dist[t]+1;
                pre[m[i]]={'A'+i,t};
                q.push(m[i]);
                if(m[i]==endstring) return dist[endstring];
            }
        }
    }
    return -1;
}
int main(){
    for(int i=0;i<8;i++){
        int num;
        cin>>num;
        endstring=endstring+char(num+'0');
    }
    int step=bfs();
    string res="";
    while (endstring != start)
    {
        res += pre[endstring].first;
        endstring = pre[endstring].second;
    }
    reverse(res.begin(), res.end());
    if (step > 0) cout << res << endl;
    cout<<step<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

190. 字串变换(双向BFS)

https://www.acwing.com/problem/content/192/

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
string A,B;
string a[6],b[6];
int n;
int extend(queue<string>&q,unordered_map<string,int>&da,unordered_map<string,int>&db,string a[],string b[]){
    int d=da[q.front()];//因为要算出同一层的状态,所以先算出该状态的长度
    while(q.size() && da[q.front()]==d){
        auto t=q.front();
        q.pop();
        for(int i=0;i<n;i++){
            for(int j=0;j<t.size();j++){
                if(t.substr(j,a[i].size())==a[i]){
                    //匹配到了
                    string r=t.substr(0,j)+b[i]+t.substr(j+a[i].size());//替换
                    if(db.count(r)) return da[t]+db[r]+1; //说明在另外一个bfs里出现该状态
                    if(da.count(r))continue;
                    da[r]=da[t]+1;
                    q.push(r);
                }
            }
        }
    }
    return 11;//说明这次搜索的状态层没有搜索到
}
int bfs(){
    queue<string>qa,qb;
    unordered_map<string,int>da,db;
    qa.push(A),qb.push(B);
    da[A]=0,db[B]=0;
    int step=0;
    int t=0;
    while(qa.size() && qb.size()){
        if(qa.size()<qb.size()){
            t=extend(qa,da,db,a,b);
        }
        else{
            t=extend(qb,db,da,b,a);
        }
        if(t<=10){
            return t;
        }
        if(++step==10) return -1;
    }
    return -1;
}
int main(){
    cin>>A>>B;
    while(cin>>a[n]>>b[n]) n++;
    int t=bfs();
    if(t==-1) puts("NO ANSWER!");
    else cout<<t<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

1116. 马走日

https://www.acwing.com/problem/content/1118/

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
int n,m,x,y;
int st[15][15];
int T;
int ans;
int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[] = {1, 2, 2, 1, -1, -2, -2, -1};
void dfs(int x,int y,int cnt){
    if(cnt==n*m){
        ans++;
        return ;
    }
    st[x][y]=1;
    for(int i=0;i<8;i++){
        int a=x+dx[i];
        int b=y+dy[i];
        if(a<0 || a>=n ||b<0 ||b>=m) continue;
        if(st[a][b]) continue;
        dfs(a,b,cnt+1);
    }
    st[x][y]=0;
}
int main(){
    cin>>T;
    while(T--){
        ans=0;
        cin>>n>>m>>x>>y;
        memset(st,0,sizeof st);
        dfs(x,y,1);
        cout<<ans<<endl;
    }

  return 0;
}
//  freopen("testdata.in", "r", stdin);
posted @ 2021-06-01 15:04  一个经常掉线的人  阅读(55)  评论(0)    收藏  举报