蓝桥杯第五届第9题
来源:互联网 发布:js 触发事件 trigger 编辑:程序博客网 时间:2024/06/05 20:18
标题:地宫取宝 X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。 当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。 请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。【数据格式】 输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12) 接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值 要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。例如,输入:2 2 21 22 1程序应该输出:2再例如,输入:2 3 21 2 32 1 5程序应该输出:14资源约定:峰值内存消耗 < 256MCPU消耗 < 1000ms
#include<stdio.h>#define N 50#define M 50#define MaxSize 5000typedef struct{int i,j;int kk;//物品数量 int max;//最大的 }Box;typedef struct{Box data[MaxSize];int top;}SqTack;//经典迷宫问题的结构体 SqTack sq;int mg[N][M],num[50]={0},n,m,k,c=0,ys=1000000007;void push(int i,int j,int kk,int max)//进栈 {sq.top++;sq.data[sq.top].i=i;sq.data[sq.top].j=j;sq.data[sq.top].kk=kk;sq.data[sq.top].max=max;}int xdfa(int s)//用数组保存数 {int i=0;num[0]++;while(i<=s){if(num[i]>9){num[i+1]+=num[i]/10;num[i]=num[i]%10;}i++;}if(num[i]!=0)return i;elsereturn i-1;}int decre(int cc)//大数作减法 {int ysz[10]={7,0,0,0,0,0,0,0,0,1},i;for(i=0;i<cc;i++){if(i<10)num[i]=num[i]-ysz[i];if(num[i]<0){num[i]=10+num[i];num[i+1]--;}}if(num[cc]==0)return cc-1;elsereturn cc;}int toInt(int cc)//数组转为整数 {int m=0;while(cc>=0){m=m*10+num[cc];cc--;}return m;}void print(int cc)//cc表示的是数组最高位,cc+1表示的是数组中的有效位数 {while(cc>9)cc=decre(cc);printf("%d\n",toInt(cc)%ys);}void quBao(int xi,int yi,int xe,int ye){int i,j,max,kk=0,flag=0;sq.top=-1;sq.top++;sq.data[sq.top].i=i=xi;sq.data[sq.top].j=j=yi;sq.data[sq.top].kk=0;sq.data[sq.top].max=0;max=mg[i][j];kk++;while(flag==0){flag=1;if(i==xe&&j==ye&&kk==k){c=xdfa(c);}if(i==xe&&j==ye&&sq.top>-1){i=sq.data[sq.top].i;j=sq.data[sq.top].j;max=sq.data[sq.top].max;kk=sq.data[sq.top].kk;sq.top--;flag=0;}if(i+1<n&&j+1<m){if(mg[i+1][j]>max){push(i+1,j,kk,max);push(i+1,j,kk+1,mg[i+1][j]);}elsepush(i+1,j,kk,max);if(mg[i][j+1]>max)push(i,j+1,kk+1,mg[i][j+1]);j=j+1;flag=0;}else if(i+1<n){if(mg[i+1][j]>max)push(i+1,j,kk+1,mg[i+1][j]);i=i+1;flag=0;}else if(j+1<m){if(mg[i][j+1]>max)push(i,j+1,kk+1,mg[i][j+1]);j=j+1;flag=0;}}}int main(){int i,j;scanf("%d%d%d",&n,&m,&k);for(i=0;i<n;i++)for(j=0;j<m;j++)scanf("%d",&mg[i][j]);quBao(0,0,n-1,m-1);print(c);}
0 0
- 蓝桥杯第五届第9题
- 第五届 蓝桥杯 本科B组 C/C++ 第9题 地宫取宝 记忆化搜索
- 第五章第5题
- 第35课第五题
- 第36课第五题
- 第39课第五题
- 第40课第五题
- 《C Primer Plus(第五版)中文版》第9章第1至8题
- 第32课作业第五题
- 第35课第五题拓展
- 提高篇第16-19第五题
- 第12章课后第五题
- 第五届蓝桥杯JavaB组第7题
- 第五届校内选拔javaB组-第一道题正则表达式
- HDU 5351 MZL's Border(2015多校第五场第9题) 写长串找规律
- 第三节第五周
- 第五周第一天
- 第五周第三天
- R语言数据分析系列之七
- HBase简介
- python 解析http post传递的数据(FieldStorage类 如何 解析http body中json数据)
- 吃得苦中苦 方为人上人
- F340 IO设置成digital input
- 蓝桥杯第五届第9题
- Objective C学习笔记(五)
- trying new thing
- C++单链表对环的操作。
- POJ 2559 Largest Rectangle in a Histogram -- 动态规划
- windows配置Android开发环境
- 黑马程序员----java内省--注解--类加载器
- 蓝桥杯 结果填空 欧拉与鸡蛋
- C#beginInvoke和endinvoke