c++,二维数组中的数值代表金币数,从左上角出发,只能向下或者向右移动,判断是否存在获取指定金币数值N的路径

来源:互联网 发布:unity3d插件map lab 编辑:程序博客网 时间:2024/05/16 17:04

/*

例如:

如下图所示,有一片棋盘格子样的街区,每个十字路口可能有一个传送门结束游览,用0表示,或者可能有一些金币供拾取,用地图上的数字表示。从左上角出发,只能向下或者向右移动,求给定地图是否存在某个路径可以获得指定数额的金币N。


*--5---1--4---15-23--4--8--1--15
|    |     |    |        |    |      |    |    |   |
1--0---3--12--1---0--9--3--4--8
|     |     |     |     |     |     |    |    |   |
4--5---7--0--58---5--0--7--9--3
|     |      |    |      |     |    |     |    |   |
7--11--5--1---4--72--1--2--9--3

*/

/*

解决代码如下

*/

/*

基本思路是利用递归算法实现

*/

#include <iostream>



using namespace std;

//二维数组array中找number

void seek(int array[4][10],int number);

//向右找,array仍然是原来的数组,a,b表示目前所在的左上角坐标,number表示要找的数

void seekRight(int array[4][10],int a,int b,int number);

//向左找,array仍然是原来的数组,a,b表示目前所在的左上角坐标,number表示要找的数

void seekDown(int array[4][10],int a,int b,int number);

//判断是否找到的标志,初始化为false

bool finded = false;
int main()

{

//初始化数组

    int array[4][10] =
    {
        {0,5,1,4,15,23,4,8,1,15},
        {1,0,3,12,1,0,9,3,4,8},
        {4,5,7,0,58,5,0,7,9,3},
        {7,11,5,1,4,72,1,2,9,3}

    };

//用于存储输入的数,先初始化为0

    int number = 0;
    do
    {

        finded = false;

//输入数

        cout<<"please input a number:";


        cin>>number;

        cout<<"输入的是:"<<number<<endl;

//找数

        seek(array,number);

//如果找到

        if(finded)

            cout<<"finded!!!"<<endl;

//否则

        else
            cout<<"not finded!!!"<<endl;
    }while(number != -1);


}
void seek(int array[4][10],int number)

{

//一开始左上角坐标是数组array[0][0];所以a = 0,b = 0;

    int a = 0,b = 0;

//向右找这个数

    seekRight(array,a,b,number);

//向左找数

    seekDown(array,a,b,number);
}
void seekRight(int array[4][10],int a,int b,int number)

{

//如果找到了

    if(number == array[a][b+1])
    {
        finded = true;

    }

    else if(number>array[a][b+1])

    {

//递归调用,不过数组的左上角坐标得发生变化,由于是向右找所以a不变,b+1,同时变成找number-array[a][b+1],其他类似

        seekRight(array,a,b+1,number-array[a][b+1]);
        seekDown(array,a,b+1,number-array[a][b+1]);
    }
    else if(number < array[a][b+1])
    {
        //do nothing
    }
}
void seekDown(int array[4][10],int a,int b,int number)
{
    if(number == array[a+1][b])
    {
        finded = true;
    }
    else if(number>array[a+1][b])
    {
        seekRight(array,a+1,b,number-array[a+1][b]);
        seekDown(array,a+1,b,number-array[a+1][b]);
    }
    else if(number<array[a+1][b])
    {
        // do nothing
    }
}
阅读全文
0 0
原创粉丝点击