c++,2次元配列の数値は金貨数を表し,左上隅から下または右にしか移動できず,指定した金貨数値Nを取得する経路があるか否かを判断する.


/*

  :

     ,           ,                  , 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 

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<>number;

        cout<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