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

xiaoxiao2021-02-28  124

/* 例如: 如下图所示,有一片棋盘格子样的街区,每个十字路口可能有一个传送门结束游览,用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     } }

 

转载请注明原文地址: https://www.6miu.com/read-70427.html

最新回复(0)