游戏走123步--解析

最近玩了个游戏,界面大概如下:

3 2 1
1 1 2
2 3 3

玩法介绍:

从图上的任意值为1的开始走,每个点只能走一遍,只能向上下左右四个方向,不能跳格,走完所有点算赢,这个是个简单的界面,复杂的就是行和列为9*9的矩阵,或者更多

下面给出解法:

Option Explicit
Dim arr() As Integer, res() As Integer   ‘数据数组和结果数组
Dim s() As Integer  ‘模拟堆数组
Dim sLen2 As Integer  ‘堆的二维长度
Dim rowNum As Integer, colNum As Integer  ‘数组行数和列数
Dim isTrue As Boolean ‘判断是否成功

Sub main()
initArr
initS
makePath
If isTrue Then
    showArr res
    showPath res
End If
isTrue = False
End Sub

Sub makePath()
    ReDim valin(sLen2) As Integer
    Dim i, j As Integer
    i = 0
    Do While i <= rowNum And isTrue = False
        j = 0
        Do While j <= colNum And isTrue = False
            If arr(i, j) = 1 Then
                ‘val(row,col,nextValue,dir,order)
                valin = buildVal(i, j, 2, 1, 1)
                ‘s(),val(row,col,nextValue,dir,order)
                push s, valin
                Do While isTrue = False And s(0, 0) > 1
                    Dim valOut() As Integer, x, y As Integer
                    valOut = readS(s)
                    Do While valOut(3) <= 4
                        x = valOut(0)
                        y = valOut(1)
                        Select Case valOut(3)
                        Case 1
                            y = y + 1
                        Case 2
                            x = x + 1
                        Case 3
                            y = y - 1
                        Case 4
                            x = x - 1
                        End Select

                        s(s(0, 0) - 1, 3) = s(s(0, 0) - 1, 3) + 1
                        If x <= UBound(arr) And x >= LBound(arr) And y <= UBound(arr, 2) And y >= LBound(arr, 2) Then
                            If valOut(2) = arr(x, y) And isFooted(x, y) Then
                                valin = buildVal(x, y, (valOut(2) + 1) Mod 3, 1, valOut(4) + 1)
                                push s, valin
                                Exit Do
                            End If
                        End If
                        valOut(3) = valOut(3) + 1
                    Loop
                    If valOut(3) > 4 Then
                    pop s
                    End If
                Loop
                Do While s(0, 0) > 1
                    valOut = pop(s)
                    res(valOut(0), valOut(1)) = valOut(4)
                Loop
            End If
            j = j + 1
        Loop
        i = i + 1
    Loop
End Sub

‘行号,
‘列号,
‘查找下一个值
‘方向:1右,2下,3左,4上
‘查找总数,用于判断是否全部查找完成,以及输出步骤的序列
Function buildVal(ByVal i As Integer, ByVal j As Integer, ByVal nextValue As Integer, ByVal dir As Integer, ByVal order As Integer)
Dim t() As Integer
ReDim t(sLen2)
t(0) = i
t(1) = j
If nextValue = 0 Then
    t(2) = 3
Else
    t(2) = nextValue
End If
t(3) = dir
t(4) = order
If order = (rowNum + 1) * (colNum + 1) Then
    isTrue = True
End If
buildVal = t
End Function

Sub initS()
    sLen2 = 4
    ReDim s((rowNum + 1) * (colNum + 1) + 1, sLen2)
    Dim i As Integer
    For i = 0 To sLen2
        s(0, i) = 0
    Next i
    s(0, 0) = 1
End Sub

Sub initArr()

rowNum = Sheets("sheet2").UsedRange.Rows.Count - 1
colNum = Sheets("sheet2").UsedRange.Columns.Count - 1
ReDim arr(rowNum, colNum) As Integer
Dim r, c As Integer
For r = 1 To rowNum + 1
    For c = 1 To colNum + 1
        arr(r - 1, c - 1) = Sheets("sheet2").Cells(r, c).Value
    Next c
Next r

ReDim res(rowNum, colNum) As Integer

End Sub

Sub showPath(p() As Integer)
Dim s1 As String, i As Integer, j As Integer
‘删除原有数据
ActiveSheet.Range("a1:az100").Select
Selection.Clear
Selection.RowHeight = 15
Selection.ColumnWidth = 8.43
Cells(10, 10).Select
‘填充步骤序列
For i = 0 To rowNum
    For j = 0 To colNum
        ActiveSheet.Cells(i + 1, j + 1) = p(i, j)
        ActiveSheet.Cells(i + 1, j + 1).ColumnWidth = 2
        ActiveSheet.Cells(i + 1, j + 1).RowHeight = 15
    Next
Next
End Sub

Sub showArr(ByRef aa() As Integer)
‘MsgBox ("数组内容如下:")
Dim s1 As String, i As Integer, j As Integer
For i = 0 To rowNum
    For j = 0 To colNum
        s1 = s1 & aa(i, j) & ","
    Next
    s1 = s1 & vbCrLf
Next
MsgBox (s1)
End Sub

‘判断坐标是否已经走过
Function isFooted(ByVal i As Integer, ByVal j As Integer)
    Dim x As Integer
    Dim b As Boolean
    b = True
    For x = 1 To s(0, 0) - 1
        If i = s(x, 0) And j = s(x, 1) Then
            b = False
        End If
    Next x
    isFooted = b
End Function

Function readS(s() As Integer)
    Dim arrLen As Integer, t() As Integer, i As Integer
    arrLen = UBound(s, 2)
    ReDim t(arrLen) As Integer
    If s(0, 0) > 1 Then
        For i = 0 To arrLen
            t(i) = s((s(0, 0) - 1), i)
        Next i
    Else
        For i = 0 To arrLen
            t(i) = -1
        Next i
    End If
    readS = t
End Function

Function pop(s() As Integer)
    Dim arrLen As Integer, t() As Integer, i As Integer
    arrLen = UBound(s, 2)
    ReDim t(arrLen) As Integer
    If s(0, 0) > 1 Then
        s(0, 0) = s(0, 0) - 1
        For i = 0 To arrLen
            t(i) = s(s(0, 0), i)
        Next i
    Else
        For i = 0 To arrLen
            t(i) = -1
        Next i
    End If
    pop = t
End Function

Function push(s() As Integer, val() As Integer)
    Dim arrLen As Integer, i As Integer
    arrLen = UBound(val)
    For i = 0 To arrLen
        s(s(0, 0), i) = val(i)
    Next i
    s(0, 0) = s(0, 0) + 1
End Function
时间: 2024-10-27 13:30:27

游戏走123步--解析的相关文章

华为机试题 N阶楼梯的走法,每次走一步或者两步

在Stairs函数中实现该功能: 一个楼梯有N阶,从下往上走,一步可以走一阶,也可以走两阶,有多少种走法? (0<n<=30)<> 例如3阶楼梯有3种走法: 1.1.1 1.2 2.1 输入样例: 3 返回值样例: 3 思路:这是最典型的类似斐波那契数列的变型.N阶楼梯,第一步有两种走法,1.走一步,则剩下N-1级      2,走两步,剩下N-2级      所以f(n)=f(n-1)+f(n-2) public static int ways(int n){ if(n==1)

如果从起点到终点需要走十步,那么最累的时候可能实在三五步左右的时候 [转]

一位朋友跟我说起他最近的困惑: 他一直很努力,一步一个脚印地前行,隔一段时间就登上一个台阶:可是几年过去,突然有一天发现自己走过的和正在的每一个台阶上都挤满了人,并且谁都知道金字塔尖上就那么寥寥的几个位置而已,却又仰之弥高:突然间非常沮丧绝望. 这是人生常态啊.我有两个故事讲给他,也可以讲给所有正在路上的人——当年要是有人也这样给我讲过就好了. 托福作文题库中有一道相当有趣的题目:“有些著名的体育明星或者娱乐明星每年赚几百万美元.你认为他们真的值那么高的薪水么?使用具体的理由和例子支持你的观点.

经典矩阵快速幂之二-----hdu2157(走k步到

题意:(中问题,题意很简单 思路:a走k步到b,其实就是A^k,ans.mat[a][b]就是答案. 其实就是离散的邻接矩阵那个P(不想证明,逃 #include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include<cstring> #include<queue

(hdu step 3.1.6)统计问题(求不断地左右走、向上走n步的方案数)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: 统计问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 732 Accepted Submission(s): 466   Problem Description

用模板元实现50个台阶问题,一次走一步或者两步或者3步,用模板元实现求裴波那契额数列

 1.用模板元实现50个台阶问题,一次走一步或者两步或者3步 2.分析 由上面分析可以知道,到达N(N > 3)级台阶时的次数为:目标台阶的前3个台阶分别直接到目标台阶的次数总和. 3.模板元把在运行时消耗的时间,在编译器键优化. 4.通过模板元实现的代码如下: #include <iostream> /*这里是int 类型的,N表示台阶数量*/ template<int N> struct data { enum { res = data<N - 1>::r

如何走出区块连游戏改造第一步?

前段时间,在美国硅谷的区块链峰会中,当Ripple执行董事Chris Larsen被问起2020年以前,区块链最好的应用领域会在哪里的时候,他只回答了一个方向,那就是区块链加游戏的结合. Ripple执行董事Chris Larsen Chris Larsen认为,区块链的"交易属性"和"资产唯一私有特性"给人们带来了新鲜感和极好的体验感,这将是区块链未来发展的重要方向. 区块链给游戏领域带来的改革 传统游戏以游戏开发商和投资商为尊,忽视玩家的利益,玩家只是"

每次只能走5步或则3步,求达到N阶楼梯的具体走法,并打印

#include <iostream> #include <stack> using std::cin; using std::cout; using std::endl; using std::stack; void step(int num); //存储,总方法数 int numStep; int main(int argc, char **argv) {     int num;     cout << "Enter the num:" <

100个台阶,一次走一步,走两步,走三步,有多少种可能

分析 第一个台阶  1第二个台阶  11 2    //走两次1步或者走1次两步第三个台阶  111 12 21 3 第四个台阶  1111 112 121 211 22 13 31f(n)=f(n-1)+f(n-2)+f(n-3)  第n个台阶的可能 = n-1台阶的可能+n-2台阶的可能+n-3台阶的可能 我这里采用了递归算法 //param x 台阶数目 int goadd(int x) { if (x == 1){ return 1; } else if (x == 2){ return

n个台阶,每次都可以走一步,走两步,走三步,走到顶部一共有多少种可能

分析 第一个台阶  1第二个台阶  11 2    //走两次1步或者走1次两步第三个台阶  111 12 21 3 第四个台阶  1111 112 121 211 22 13 31 思想:4阶台阶,第一次可以迈1步(还剩3台阶也就是f(3)可能)或者2步(还剩2台阶也就是f(2)可能)或者3步(还剩1台阶也就是f(1)可能) f(n)=f(n-1)+f(n-2)+f(n-3)  第n个台阶的可能 = n-1台阶的可能+n-2台阶的可能+n-3台阶的可能 我这里采用了递归算法 //param x