欧阳的取数游戏


试题描述

初一信息学社团有两个天资聪明、刻苦勤奋的欧阳同学,他们看到社团里很多同学都设计出了一种数字游戏,于是富有创新的他俩合计设计了一款数字游戏。他们花一个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 }
时间: 2024-10-05 14:09:35

欧阳的取数游戏的相关文章

BZOJ 1978: [BeiJing2010]取数游戏 game( dp )

dp(x)表示前x个的最大值,  Max(x)表示含有因数x的dp最大值. 然后对第x个数a[x], 分解质因数然后dp(x) = max{Max(t)} + 1, t是x的因数且t>=L ----------------------------------------------------------------------------------------- #include<cstdio> #include<cmath> #include<cstring>

[CH Round #61] 取数游戏

描述 SJY和CYF在玩一个取数游戏.他们将1~n分别写在n张纸上,随机排成一排,约定SJY先取,只能取走最边上的两张纸之一,然后CYF取:以此循环下去,取到1的人获胜.假设SJY和CYF足够聪明,求SJY获胜的概率. 输入 一个整数n 输出 SJY获胜的概率,保留最简分数形式(若为1,则输出1/1:若为0,则输出0/1). 样例 样例输入1 2 样例输出1 1/1 样例输入2 3 样例输出2 2/3 数据范围与约定 40%的数据,0<n≤7. 70%的数据,0<n≤1000. 100%的数据

【贪心】取数游戏

问题 N: [贪心]取数游戏 时间限制: 1 Sec  内存限制: 64 MB提交: 51  解决: 31[提交][状态][讨论版] 题目描述 给出2n(n≤100)个自然数(小于等于30000).将这2n个自然数排成一列,游戏双方A和B从中取数,只允许从两端取数.A先取,然后双方轮流取数.取完时,谁取得数字总和最大为取胜方:若双方和相等,属B胜.试问A方是否有必胜策略? 输入 共2行,第1行一个整数n:第2行有2*n个自然数. 输出 只有1行,若A有必胜策略,则输出“YES”,否则输出“NO”

矩阵取数游戏

题目描述 Description [问题描述]帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下:1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素:2. 每次取走的各个元素只能是该元素所在行的行首或行尾:3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素值*2i,其中i 表示第i 次取数(从1 开始编号):4. 游戏结束总得分为m次取数得分之和.帅帅想请你帮忙写一个程序,对于任意矩

P1005矩阵取数游戏

题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2.每次取走的各个元素只能是该元素所在行的行首或行尾: 3.每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值*2^i,其中i表示第i次取数(从1开始编号): 4.游戏结束总得分为m次取数得分之和. 帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分. 输入输

NOIP2007 矩阵取数游戏

题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. 每次取走的各个元素只能是该元素所在行的行首或行尾: 3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素值*2i, 其中i 表示第i 次取数(从1 开始编号): 4. 游戏结束总得分为m次取数得分之和. 帅帅想请你帮忙写一个

BZOJ 1978 取数游戏(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1978 题意:给出一个数列a,在其中找出下标依次增大的数,使得任意相邻的两个数的最大公约数大于等于m.找出最多的数字. 思路:f[i]表示前面的数字中最大公约数为i可以找出的最多的数字个数.那么对于当前数字x: 接着更新f: int f[N],a[N]; int n,m; int main() { RD(n,m); int i; FOR1(i,n) RD(a[i]); int j,k;

矩阵取数游戏洛谷p1005

题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2.每次取走的各个元素只能是该元素所在行的行首或行尾: 3.每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值*2^i,其中i表示第i次取数(从1开始编号): 4.游戏结束总得分为m次取数得分之和. 帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分. 输入输

BZOJ1978: [BeiJing2010]取数游戏 game

1978: [BeiJing2010]取数游戏 game Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 650  Solved: 400[Submit][Status] Description 小 C 刚学了辗转相除法,正不亦乐乎,这小 P 又出来捣乱,给小 C 留了个 难题. 给 N 个数,用 a1,a2…an来表示.现在小 P 让小 C 依次取数,第一个数可以 随意取.假使目前取得 aj,下一个数取ak(k>j),则ak必须满足gcd(aj,a