SDNU 1241

传送门:    北望村八卦阵

Description

 北望村人人习武已成习惯,这个村子里有一个上古道人留下の八卦阵,今天,初出茅庐的陆历川决定挑战一下这个八卦阵,八卦阵中有很多东西
.代表这里是安全的可以走
*代表这里是不安全的不可以走
L代表这里有阴仪
W代表这里有阳仪
陆历川知道在这个八卦阵的X,Y处有一部功法,他想要去拿到它,现在他想知道他从
入口(入口固定为1,1)进入八卦阵拿到功法再从入口出来最少需要走几步?如果没办法拿到功法输出IMPOSSIBLE
陆历川到达阴仪会受到阴仪的影响,到达阳仪会受到阳仪的影响,如果既受到阴仪又受到阳仪的影响,陆历川就会走火入魔,然后GG。

Input

第一行一个T(0 < T < 100) 代表有几组测试样例
<t<10) 代表有t组样例
每组样例第一行四个数n,m,X,Y(0 < n, m, X, Y < 100)<n<100,0<m<100, div="" 0<x<100,0<y<100)<="">
n,m表示八卦阵的大小
X,Y代表功法所在位置
接下来n行,每一行m个字符

Output

题目要求

Sample Input

1
3 3 3 2
.*.
..L
W.*

Sample Output

6

BFS 

 注意一下W L 可能不止一个,不止一个,不止一个,

思路:把W L 的坐标分别标记下来,第一次遍历时把是 L 地方修改成  .  把 W 的地方修改成 *  ; 第二次 遍历时 把 L 的地方修改成 *  把 W 的地方修改成  .  如果能拿到功法,最短的距离则为第一次 遍历 和 第二次遍历 的 最小值 × 2 ( 往返嘛 )

代码粘上,不喜勿喷。。。

#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
int n,m,x,y;
int dis[120][120],xw[120],yw[120],xl[120],yl[120];
int xxx[5]={1,-1,0,0};
int yyy[5]={0,0,1,-1};
bool flag ;
bool vis[120][120];
char a[120][120];
struct zuo{
    int x;
    int y;
};
queue<zuo>q;
zuo vs,ve,vd;
int check(int x,int y)
{
    if(x>=1&&x<=n&&y>=1&&y<=m&&!vis[x][y]&&a[x][y]!='*')
        return true;
    return false;
}
int bfs()
{
    bool bl=0;
    while(!q.empty())
        q.pop();
        vis[1][1] = 1;
        dis[1][1] = 0;
        vs.x = 1;
        vs.y = 1;
        q.push(vs);
    while(!q.empty())
        {
            vd = q.front();
            if(vd.x == x&&vd.y==y)
            {
                flag = 1;
                bl =1;
                return dis[vd.x][vd.y];
            }
            q.pop();
            for(int i=0;i<=3;i++)
            {
                vs.x = vd.x + xxx[i];
                vs.y = vd.y + yyy[i];
                if(check(vs.x,vs.y))
                {
                  vis[vs.x][vs.y] =1;
                dis[vs.x][vs.y] = min(dis[vs.x][vs.y],dis[vd.x][vd.y]+1);
                q.push(vs);
                }
            }
        }
        if(!bl)
            return 100000;
}
int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        cin>>n>>m>>x>>y;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                dis[i][j] = 10000;
                vis[i][j] = 0;
            }
        }
        int p=0,k=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
                if(a[i][j] == 'W')
                {
                    xw[p] = i;
                    yw[p] = j;
                    p++;
                }
                if(a[i][j] == 'L')
                {
                    xl[k] = i;
                    yl[k] = j;
                    k++;
                }
            }
        }
        flag =0;
        for(int i=0;i<p;i++)
        {
            a[xw[i]][yw[i]] = '*';
        }
        for(int i=0;i<k;i++)
        {
            a[xl[i]][yl[i]] = '.';
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                dis[i][j] = 10000;
                vis[i][j] = 0;
            }
        }
        int sum1 = bfs();
         for(int i=0;i<p;i++)
        {
            a[xw[i]][yw[i]] = '.';
        }
        for(int i=0;i<k;i++)
        {
            a[xl[i]][yl[i]] = '*';
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                dis[i][j] = 10000;
                vis[i][j] = 0;
            }
        }
        int sum2 = bfs();
         sum1 = min(sum1,sum2);
        if(flag)
        cout<<sum1*2<<endl;
        else
            cout<<"IMPOSSIBLE"<<endl;
    }
    return 0;
}




### 关于 SDNU 山东师范大学操作系统课程期末考试复习资料 对于准备参加山东师范大学 (SDNU) 操作系统课程期末考试的学生来说,获取全面而有效的复习资源至关重要。通常情况下,学校会提供官方的教学大纲以及历年的试题作为主要参考资料[^1]。 #### 官方渠道获取复习材料 学生可以通过学校的官方网站或教务处公告栏来获得最新的教学计划和考试指南。这些文件往往包含了详细的考核范围说明、重点章节提示等内容,有助于考生有针对性地进行备考工作[^2]。 #### 教材与讲义的重要性 除了上述提到的正式出版物外,在课堂上使用的教材也是不可或缺的一部分。特别是由授课教师编写的讲义,其中可能涵盖了特定版本的操作系统知识点解析及其应用实例分析,这些都是非常宝贵的学习素材[^3]。 #### 利用在线平台辅助学习 随着互联网技术的发展,许多高校都建立了自己的网络学堂或是加入了MOOCs(大规模开放在线课程),这为广大学生提供了更多样化的自学途径。通过访问这类教育网站,可以找到其他院校相同专业的优质视频教程和其他形式的教学资源共享链接[^4]。 ```python # Python 示例代码用于展示如何在网络爬虫中抓取公开教育资源列表(仅作示意用途) import requests from bs4 import BeautifulSoup url = 'https://example.com/sdnu_os_material' # 假设这是目标网页地址 response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') materials = [] for item in soup.select('.material-item'): title = item.find('h2').get_text() link = item.find('a')['href'] material_info = { "title": title, "link": f"https://example.com{link}" } materials.append(material_info) else: print("Failed to fetch data") print(materials[:5]) # 打印前五个条目以供查看 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值