01迷宫问题

题目描述

有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。

你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

输入格式

第1行为两个正整数n,m。

下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。

接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。

输出格式

m行,对于每个询问输出相应答案。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1010;//数据范围为1000,开大一点防止边界问题
int n,m,sum;//sum表示能走的格子数
int g[N][N],f[N][N];//g数组存0,1地图,f数组是每一个位置能走的格子数的答案,即答案数组
int l[1000010][2];//l数组为临时坐标数组,看到下面的代码你就知道了
int d[4][2] = {-1,0,0,1,1,0,0,-1};//相邻4格的坐标,即上,右,下,左的顺序
void dfs(int x,int y)
{
    sum ++;//进入搜索,首先将sum加一
    l[sum][0] = x;
    l[sum][1] = y;//将x和y存入临时坐标数组中
    f[x][y] = 1;//因为当前搜素到了这个坐标,于是将该坐标对应的答案标记为1
                //这里不需要恢复,因为我们后面操作的坐标可能会重复或者已经
                //走过,为我们节省了大量的时间
    for(int i = 0;i < 4;i ++)//搜素相邻的4个格子
    {
        int u = x + d[i][0],v = y + d[i][1];//格子的变换
        if(u < 1||v < 1||u > n||v > n) continue;//坐标超出边界,进行下一次循环
        if(f[u][v] > 0) continue;//该坐标对应的答案大于0,说明已经走过,进行下一次循环
        if(g[u][v] == g[x][y]) continue;//因为是从0跳1,或者从1跳0,如果变换过后的坐标与没变 
                                        //换之前的坐标对应的地图上的数字相等的话,就说明这里不 
                                        //能走,进行下一次循环
        dfs(u,v);//上面的条件都没有满足的话,说明这个点可以搜素
    }
}
int main()
{
    cin >> n >> m;//读入n和m
    for(int i = 1;i <= n;i ++)
    for(int j = 1;j <= n;j ++)
    scanf("%1d",&g[i][j]);//读入0,1地图(1d中的1是数字1,限宽的作用)
    memset(f,0,sizeof(f));//将答案数组初始化为0
    while(m --)//m个操作
    {
        sum = 0;//能够走的格子数记得每次操作时都要归0
        int x,y;
        cin >> x >> y;//读入开始格子的坐标
        if(f[x][y] > 0) //如果该坐标的答案大于0,则说明走过这里,直接输出答案
        {
            printf("%d\n",f[x][y]);
            continue;//记得进入下一次循环
        }
        dfs(x,y);//如果该坐标答案数组里面没有,则说明没有走过该坐标,就要进行搜索
        for(int i = 1;i <= sum;i ++)
        f[l[i][0]][l[i][1]] = sum;//将走过的坐标能够走的格子数存下来,节省时间
                                  //这也是为什么需要临时坐标数组了
        printf("%d\n",sum);//输出答案
    }
    return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
VBS迷宫小游戏代码是一种使用VBScript语言编写的简单的迷宫游戏代码。在这个游戏中,玩家需要通过控制一个角色来走出迷宫。以下是一个简单的VBS迷宫小游戏代码示例: ```vbscript Dim gameBoard Set gameBoard = CreateObject("Scripting.Dictionary") ' 初始化迷宫地图 gameBoard.Add "00", "Start" ' 起点 gameBoard.Add "01", "Wall" ' 墙 gameBoard.Add "02", "Path" ' 路径 gameBoard.Add "03", "Finish" ' 终点 ' 创建迷宫地图 Dim maze Set maze = CreateObject("Scripting.Dictionary") maze.Add "00", "02" ' 起点 -> 路径 maze.Add "01", "01" ' 墙 maze.Add "02", "03" ' 路径 -> 终点 maze.Add "03", "03" ' 终点 ' 初始化角色位置 Dim playerPosition playerPosition = "00" ' 起点 ' 游戏循环 Do ' 渲染迷宫地图 For i = 0 To 1 For j = 0 To 1 Select Case gameBoard(CStr(i) & CStr(j)) Case "Start" WScript.StdOut.Write "S" & " " Case "Wall" WScript.StdOut.Write "W" & " " Case "Path" If playerPosition = CStr(i) & CStr(j) Then WScript.StdOut.Write "P" & " " Else WScript.StdOut.Write "O" & " " End If Case "Finish" WScript.StdOut.Write "F" & " " End Select Next WScript.StdOut.Write vbCrLf Next ' 接受玩家输入 Dim input input = LCase(InputBox("请选择方向移动:上(w)、下(s)、左(a)、右(d)", "移动")) ' 更新角色位置 Select Case input Case "w" If maze(playerPosition) <> maze(CStr(CInt(Mid(playerPosition, 1, 1)) - 1) & Mid(playerPosition, 2, 1)) Then playerPosition = CStr(CInt(Mid(playerPosition, 1, 1)) - 1) & Mid(playerPosition, 2, 1) End If Case "s" If maze(playerPosition) <> maze(CStr(CInt(Mid(playerPosition, 1, 1)) + 1) & Mid(playerPosition, 2, 1)) Then playerPosition = CStr(CInt(Mid(playerPosition, 1, 1)) + 1) & Mid(playerPosition, 2, 1) End If Case "a" If maze(playerPosition) <> maze(Mid(playerPosition, 1, 1) & CStr(CInt(Mid(playerPosition, 2, 1)) - 1)) Then playerPosition = Mid(playerPosition, 1, 1) & CStr(CInt(Mid(playerPosition, 2, 1)) - 1) End If Case "d" If maze(playerPosition) <> maze(Mid(playerPosition, 1, 1) & CStr(CInt(Mid(playerPosition, 2, 1)) + 1)) Then playerPosition = Mid(playerPosition, 1, 1) & CStr(CInt(Mid(playerPosition, 2, 1)) + 1) End If End Select ' 检查是否走出迷宫 If playerPosition = "02" Then MsgBox "恭喜你走出了迷宫!" Exit Do End If Loop ``` 以上代码实现了一个简单的VBS迷宫小游戏,玩家可以使用上下左右键控制角色移动,最终目标是走出迷宫。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薇尔莉特伊芙加登

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值