首页 > 其他分享 >字母迷宫题解

字母迷宫题解

时间:2024-03-24 16:44:42浏览次数:21  
标签:1210 题解 字母 迷宫 Next maps que && ans

思路:

看到这题一眼跑广搜,但是转眼天堂之门,欸为什么要加2?

好像没法广搜(不满足广搜特性),咋办?凉拌。

该怎么让它满足广搜特性(先搜到的是最优的)。

欸,我们是不是可以将队列换成优先队列让先搜到的最优。好像是的欸,优先队列启动!

代码:

#include<bits/stdc++.h>
using namespace std;
int ans[1210][1210],nxt[4][2]={1,0,0,1,-1,0,0,-1},nxt1[4][2]={2,0,0,2,-2,0,0,-2},nxt2[4][2]={1,1,1,-1,-1,-1,-1,1},n;
char maps[1210][1210];
struct node{
    int x,y,step;
    friend bool operator<(const node X,const node Y){
        return X.step>Y.step;
    }
};
void bfs(){
    priority_queue<node> que;
    if(maps[1][1]!='*') que.push({1,1,1}),ans[1][1]=1;
    if(maps[1][n]!='*') que.push({1,n,1}),ans[1][n]=1;
    if(maps[n][1]!='*') que.push({n,1,1}),ans[n][1]=1;
    while(!que.empty()){
        node Now=que.top();
        que.pop();
        if(Now.x==n&&Now.y==n){
            cout<<Now.step;
            exit(0);
        }
        if(maps[Now.x][Now.y]=='A'){
            for(int i=0;i<4;i++){
                node Next=Now;
                Next.x+=nxt[i][0];
                Next.y+=nxt[i][1];
                Next.step++;
                if(Next.x>=1&&Next.x<=n&&Next.y>=1&&Next.y<=n&&Next.step<ans[Next.x][Next.y]&&maps[Next.x][Next.y]!='*'){
                    ans[Next.x][Next.y]=Next.step;
                    que.push(Next);
                }
            }
        }else if(maps[Now.x][Now.y]=='B'){
            for(int i=0;i<4;i++){
                node Next=Now;
                Next.x+=nxt1[i][0];
                Next.y+=nxt1[i][1];
                Next.step++;
                if(Next.x>=1&&Next.x<=n&&Next.y>=1&&Next.y<=n&&Next.step<ans[Next.x][Next.y]&&maps[Next.x][Next.y]!='*'){
                    ans[Next.x][Next.y]=Next.step;
                    que.push(Next);
                }
            }
        }else{
            for(int i=0;i<4;i++){
                node Next=Now;
                Next.x+=nxt2[i][0];
                Next.y+=nxt2[i][1];
                Next.step+=2;
                if(Next.x>=1&&Next.x<=n&&Next.y>=1&&Next.y<=n&&Next.step<ans[Next.x][Next.y]&&maps[Next.x][Next.y]!='*'){
                    ans[Next.x][Next.y]=Next.step;
                    que.push(Next);
                }
            }
        }
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            ans[i][j]=1e9;
            cin>>maps[i][j];
        }
    }
    bfs();
    cout<<"No answer";
}

标签:1210,题解,字母,迷宫,Next,maps,que,&&,ans
From: https://www.cnblogs.com/zhouyk0501/p/18092615

相关文章

  • cfEduRound163div2--D题解
    D-TandemRepeats?题意:做法:因为字符串长度较少,可以考虑枚举。or--动态规划voidsolve(){//D枚举//枚举!!!!!!!!!!stringstr;cin>>str;intn=str.size(),ans=0;for(inti=1;i<=n/2;i++){//枚举一半!!!intcnt=0;for(intj=0;......
  • 代码随想录 第25天 | ● 216.组合总和III ● 17.电话号码的字母组合
    leetcode:216.组合总和III-力扣(LeetCode)classSolution{List<List<Integer>>res=newArrayList<>();LinkedList<Integer>link=newLinkedList<>();publicList<List<Integer>>combinationSum3(i......
  • 题解 CF1948G【MST with Matching】
    非常精彩的转化!显然,树是二分图。由König定理,我们知道:二分图最小点覆盖等于最大匹配。因此枚举点覆盖\(S\),则一条边\((u,v)\)可以被选择,当且仅当\(u\inS\lorv\inS\),在所有可以选择的边上跑最小生成树即可。我采用的是Kruskal算法,时间复杂度为\(O(2^nn^2\logn)\),可......
  • 20240324每日一题题解
    20240324每日一题题解Problem给两个按照非递减顺序排列的整数数组num1和num2,另外有两个整数m和n,分别表示num1和num2中的元素数目。请合并num2到num1中,使得合并后的数组还是按照非递减顺序排列。注意,需要将合并之后的数组还是存储在数组num1中。示例1:输入:nums1=[1,2,3,0,......
  • 牛客周赛ROUND37--C题解
    C-红魔馆的馆主(495倍数)题意:做法:dfs搜索后面添加的数字。stringans="1000000000000000000";voiddfs(intcur,stringaddnum){//用数字写的话会无限dfs,因为addnum永远等于0。if(cur==0){if(addnum.size()<ans.size())ans=addnum;return;......
  • 最长子字符串的长度(二)【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-最长子字符串的长度(二)给你一个字符串s,字符串s首尾相连成一个环形,请你在环中找出’l’、‘o’、‘x’字符都恰好出现了偶数次最长子字符串的长度。输入描述:输入是一串小写的字母组成的字符串。输出描述:输出是一个整数补充说明:1<=s.length<=5x10^5......
  • 孙悟空吃蟠桃【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-孙悟空吃蟠桃孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有N颗桃树,每颗树上都有桃子,守卫将在H小时后回来。孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉K个,如果树上的桃子少于K个,则全部吃掉,并且这一小时剩余的时间里不再......
  • P10234 [yLCPC2024] B. 找机厅 题解
    题目简述给定一个$n$行$m$列的$01$矩阵,每次可以花费$1$的时间移动到邻近的上下左右的四个格子,求从$(1,1)$点到$(n,m)$的最少时间,并给出具体路径。题目分析第一问易发现是BFS模板题,在这里不多说。第二问我们首先考虑正着记录,即记录每一个点转移到了哪一个点,但......
  • CF1896C Matching Arrays 题解
    题目简述给定两个长度为$n$的数列$a,b$,再给定一个数$x$,请你判断是否存在一种重排$b$数列的方式,使得满足$a_i>b_i$的$i$恰好有$x$个。$n\leq2\times10^5$。题目分析遇到这种可行性问题,首先考虑做出最优解,以此来判断是否无解。接下来,可以思考最优解如何构造,我们......
  • CF1468J Road Reform 题解
    题目简述给定一个有$n$个节点,$m$条无向带权边的图,和一个参数$k$,第$i$条边权值为$s_i$。现在你要保留这个图中的$n-1$条边使得这个图变成一棵树,然后你可以对这棵树上的任意边进行修改,每次修改可以使这个边的权值加上一或减去一。现在你需要使所有边权的最大值正好等于......