欧阳的取数游戏

试题描述

    初一信息学社团有两个天资聪明、刻苦勤奋的欧阳同学,他们看到社团里很多同学都设计出了一种数字游戏,于是富有创新的他俩合计设计了一款数字游戏。他们花一个R行C列的表格,然后在每一个格子中放入一个正整数,而且做到了每一个格子,它上下左右相邻格子里的数都不会与该格子里的数相等(如果有相邻格子的话)。现在游戏者从左上角格子(起点)出发,按照欧阳们设计的规则移动到右下角的格子(终点),所到之处把数取走,走后得到所有的数的和就是本局游戏获得的积分。移动的规则是:游戏者可以从一个格沿著一条跟X轴或Y轴平行的直线走到邻接的另一个格,游戏者选择下一步的标准是哪个格子里的数大下一步就到哪个格子去(没到目标位置前总能找到唯一的最大值),如果某格子数被取过,就视其为0。所给数据保证按照这种移动方法,最终游戏者总会在(R,C)停止并取走那里的数。

输入
第一行包含两个正整数R和C, 第2到R+1行给出了所有方格里的数,每行包含C个不超过100的正整数,第i+1行的C个整数,表示第i行的每个格子的数。各行的数两两之间由一个空格分隔。
输出
一行,仅包含一个数,表示游戏者所取到的数字之和。
输入示例
3 4
3 3 4 5
4 5 3 2
1 7 4 2
输出示例
39
其他说明
数据范围:1<=R,C<=40。
 

递归+搜索

 1 #include <iostream>
 2 
 3 using namespace std;
 4 int map[101][101];
 5 int r,c,i,j,ans=0;
 6 int mx=0,x1,y1;  //下一个点(x1,y1) 
 7 int xx[4]={0,0,1,-1},yy[4]={1,-1,0,0};  //xx数组表示横轴,即左右的变化;yy数组表示纵轴,即上下的变化 
 8 void search(int x,int y)
 9 {
10     ans+=map[x][y];  //取当前数 
11     if(x==r && y==c) return;  //到终点返回 
12     map[x][y]=0;  //取完的数赋零 
13     for(i=0;i<4;i++)
14     {
15         if(map[x+xx[i]][y+yy[i]]>mx)  //往四周搜索 
16         {
17             mx=map[x+xx[i]][y+yy[i]];
18             x1=x+xx[i];
19             y1=y+yy[i];
20         }
21     }
22     mx=0;
23     search(x1,y1);  //递归 
24 }
25 int main()
26 {
27     scanf("%d%d",&r,&c);
28     for(i=1;i<=r;i++)
29         for(j=1;j<=c;j++) scanf("%d",&map[i][j]);
30     search(1,1);  //从左上角开始 
31     printf("%d",ans);
32     //system("pause");
33     return 0;
34 }
欧阳的取数游戏
原文地址:https://www.cnblogs.com/YXY-1211/p/5222528.html