Showing posts with label 蓝桥杯. Show all posts
Showing posts with label 蓝桥杯. Show all posts

排它平方数 - 永不冷�龅娜松�


排它平方数 - 永不冷�龅娜松�
小明正看着 203879 这个数字发呆。 原来,203879 * 203879 = 41566646641这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个,请你找出它!
再归纳一下筛选要求:
  1. 6位正整数
  2. 每个数位上的数字不同
  3. 其平方数的每个数位不含原数字的任何组成数位
答案是一个6位的正整数。
int judge(long i)

{

    long temp = i;

    int t[10] = {0};

    for(int m=0;m<6;m++)

    {

        int j = i%10;

        t[j]++;

        i/=10;

    }

    for (int m=0; m<10; m++) {

        if(t[m]>1)

            return 0;

    }

 

    //判断平方数

    int p = 0;

    for(long n=temp*temp; n!=0 ;p++)

    {

        if(t[n%10]!=0)

            return 0;

        n/=10;

    }

 

    return 1;

}

int main()

{

    for (long i=1000000;i<999999;i++)

    {

        if(judge(i))

        {

            printf("%ld\n",i);

        }

    }

}
Read full article from 排它平方数 - 永不冷�龅娜松�

颠倒的价牌 蓝桥杯


http://blog.csdn.net/hortond/article/details/8887866
小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。
其标价都是4位数字(即千元不等)。
小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了(参见p1.jpg)。
这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!!
当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。
有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了。
庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。
请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?
答案是一个4位的整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
思路:
9 – 》 6
6-》 9
3 4 7 不可逆转。
首先是处理好每个数字的倒挂。然后判断下就可以了。
-- find all candidate prices (its reverse - it [-200 , -300], [800, 900]), find a pair(pre sort), its sum is 558.

// 558 is not used - not work
 public static void main(String[] args) {

  DecimalFormat format = new DecimalFormat("0000");
  String num = "";
  for (int n = 1000; n < 10000; n++) {
   num = format.format(n);
   int numChange = change(num.toCharArray());
   if(numChange<1000){
    continue;
   }
   if(String.valueOf(numChange).contains("3")){
    continue;
   }// check 3, 4, 7 first
   if(String.valueOf(numChange).contains("4")){
    continue;
   }
   if ((n - numChange) >= 200 && (n - numChange) <= 300) {
    System.out.println(n);
     
    break;
   }
  }
 }

 private static int change(char[] charArray) {
  for (int i = 0; i < charArray.length; i++) {
   

   if (charArray[i] == '6') {
    charArray[i] = '9';
   } else if (charArray[i] == '9') {
    charArray[i] = '6';
   }
  }
  char[] Array2 = new char[charArray.length];
  for (int i = 0; i < charArray.length; i++) {
   Array2[i] = charArray[charArray.length-1-i];
  }
  String str  = String.valueOf(Array2);
  
  return Integer.valueOf(str);
 }

http://www.zhuangjingyang.com/%E9%A2%A0%E5%80%92%E7%9A%84%E4%BB%B7%E7%89%8C.html

错误票据 - 永不冷�龅娜松�


错误票据 - 永不冷�龅娜松�
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
要求程序首先输入一个整数N(N<100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000)
每个整数代表一个ID号。
要求程序输出1行,含两个整数m n,用空格分隔。
其中,m表示断号ID,n表示重号ID
例如:
用户输入:
2
5 6 8 11 9
10 12 9
则程序输出:
7 9
可以用位运算做
int xorValue = a[0] - a[i]异或 min to max
then split xorValue based on last 1 in its bit
then ...
pre-sort: http://blog.csdn.net/milkcu/article/details/9090515
Use map
 public static void main(String[] args){
  Scanner cin = new Scanner(System.in);
  int n = cin.nextInt();
  int[] t = new int[n*100000];
  int start = Integer.MAX_VALUE;
  int end = Integer.MIN_VALUE;
  cin.nextLine(); // 吸收一个换行符号
  for(int i=0;i<n;i++){
   String temp = cin.nextLine();
   String[] m = temp.split(" ");
   for(int j=0;j<m.length;j++){
    int index = Integer.parseInt(m[j]) ;
    if(index < start)
     start = index;
    if(index > end)
     end = index;
    t[index] ++;
   }
  }
  int[] res  = new int[2];
  for(int i=start+1;i<end;i++){
   if(t[i] == 0)
    res[0] = i;
   if(t[i] == 2)
    res[1] = i;
  }
  
  System.out.println(res[0] + " " + res[1] );
 }
Read full article from 错误票据 - 永不冷�龅娜松�

蓝桥杯 历届试题 剪格子(dfs搜索) - Freecode# - 博客园


蓝桥杯 历届试题 剪格子(dfs搜索) - Freecode# - 博客园
如下图所示,3 x 3 的格子中填写了一些整数。
+--*--+--+
|10* 1|52|
+--****--+
|20|30* 1|
*******--+
| 1| 2| 3|
+--+--+--+
我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60。
本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出 0。
输入格式
程序先读入两个整数 m n 用空格分割 (m,n<10)。
表示表格的宽度和高度。
接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000。
输出格式
输出一个整数,表示在所有解中,包含左上角的分割区可能包含的最小的格子数目。
样例输入1
3 3
10 1 52
20 30 1
1 2 3
样例输出1
3
样例输入2
4 3
1 1 1 1
1 30 80 2
1 1 1 100
样例输出2
10

  
  dfs搜索题。
  按深度优先搜索的思路从左上角开始搜索,累加当前数字,直到数字和为所有数字和的一半,返回走到当前的步数。
  需要注意的是,输入行数和列数的时候注意输入顺序。我之前做过的这种类型的题,都是先输入行数再输入列数,而这道题却是先输入列数再输入行数。这着实坑到我了,调了好久才找到原因。
http://www.zhuangjingyang.com/%E5%89%AA%E6%A0%BC%E5%AD%90.html
public class Main
{
 private static int m = 0; //col
 private static int n = 0; //row
 private static int half = 0;
 private static int sum = 0;
 private static int minValue = 100;
 private static int count = 0;
 private static int select = 0;
 private static int tnum;
 
 private static int [][] num = new int[10][10];
 private static int [][] flag = new int[10][10];
 

 private static int xzb[] = {-1,1,0,0};//上下左右
 private static int yzb[] = {0,0,-1,1};

 
 public static void main(String[] args)
 {
  int i,j,maxNum = 0, all =0;
  Scanner cin = new Scanner(System.in);
  m = cin.nextInt();
  n = cin.nextInt();
  
  for(i=0;i<n; ++i)
   for(j=0;j<m;j++)
   {
    num[i][j] = cin.nextInt();
    all += num[i][j]; //all为总和
    
    if(num[i][j] > maxNum) //找出最大值
     maxNum = num[i][j];
   }
  
  if(all%2!=0 || maxNum > all/2) //如果为奇数或者最大值大于总和一半,则没有结果
   System.out.println("0");
  else
  {
   half = all /2 ;
   //将格子每个点都作为起点搜索一遍,两个 for 循环
   for(i=0;i<m;i++)
   {
    for(j=0;j<n;j++)
    {
     select = 0;
     dfs(num[i][j],i,j);
    }
   }
   
   if(minValue != 100) //结果
    System.out.print(minValue);
   else
    System.out.print("0");
  }
  
 }
 
 static int isok(int x,int y) //判断传入的坐标值是否能被选入
 {
  int yes = 0; //不越界并且不超出和一半
  if((x>=n || x<0) || (y>=m||y<0)||(flag[x][y] == 1)||(sum+num[x][y] > half))
   yes = 1; // 冲突
  return yes;
 }
 
 
 static void back(int value,int x,int y)//执行回退处理
 {
  if(x==0 && y==0) //如果将 num[0][0] 回退掉,则标记为未选入
   select = 0; 
  -- count ;
  sum -= value;
  flag[x][y] = 0;
 }
 
 
 static void  dfs(int value,int x,int y) //dfs搜索
 {
  int i, t1, t2;
  
  if(x==0 && y==0) //主要用于B点开始的搜素,判断num[0][0]有没有被选入
   select = 1;
  flag[x][y] = 1; //标记为走过
  ++count;
  sum += value;
  
  if( sum == half)
  {
   if(select == 1) /*如果num[0,0]被选入,主要用于非[0,0]点开始的搜索*/
    tnum = count;
   
   else
    tnum = n*m - count;
   
   if(minValue > tnum)
    minValue = tnum;
  }
  else
  {
   for(i=0;i<4;i++)/*按 上下左右 顺序遍历*/
   {
    t1 = x + xzb[i];/*引入t1,t2目的是使传入的x,y值不变,便于下面的回退*/
    t2 = y + yzb[i];
    if(isok(t1,t2) == 1) //判断是否可走
     continue;
    dfs(num[t1][t2],t1,t2);
   }
  }
  //如果都不可以走,则回退
  back(value,x,y); 
 }
}
http://blog.csdn.net/acmman/article/details/18659573
int num[15][15],visit[15][15]; int i,j,n,m,sum,end=0; void Cutaws(int x,int y,int value,int count) { value+=num[x][y]; if(value==sum/2&&end!=1) { printf("%d\n",count+1); memset(visit,1,sizeof(visit)); end=1; return; } if(value>sum) return; if(y+1<n&&visit[x][y+1]==0) { visit[x][y+1]=1; Cutaws(x,y+1,value,count+1); visit[x][y+1]=0; } if(y-1>=0&&visit[x][y-1]==0) { visit[x][y-1]=1; Cutaws(x,y-1,value,count+1); visit[x][y-1]=0; } if(x+1<m&&visit[x+1][y]==0) { visit[x+1][y]=1; Cutaws(x+1,y,value,count+1); visit[x+1][y]=0; } if(y-1>=0&&visit[x-1][y]==0) { visit[x-1][y]=1; Cutaws(x,y,value,count+1); visit[x-1][y]=0; } } int main() { sum=0; memset(num,0,sizeof(num)); memset(visit,0,sizeof(visit)); scanf("%d%d",&n,&m); for(i=0;i<m;i++) for(j=0;j<n;j++) { scanf("%d",&num[i][j]); sum+=num[i][j]; } visit[0][0]=1; Cutaws(0,0,0,0); return 0; }
Read full article from 蓝桥杯 历届试题 剪格子(dfs搜索) - Freecode# - 博客园

蓝桥杯 - 兰顿蚂蚁 Langton's ant


蓝桥杯 - 兰顿蚂蚁 - 永不冷�龅娜松�
兰顿蚂蚁,是于1986年,由克里斯・兰顿提出来的,属于细胞自动机的一种。
平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只"蚂蚁"。
蚂蚁的头部朝向为:上下左右其中一方。
蚂蚁的移动规则十分简单:
若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格;
若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格。
规则虽然简单,蚂蚁的行为却十分复杂。刚刚开始时留下的路线都会有接近对称,像是会重复,但不论起始状态如何,蚂蚁经过漫长的混乱活动后,会开辟出一条规则的"高速公路"。
蚂蚁的路线是很难事先预测的。
你的任务是根据初始状态,用计算机模拟兰顿蚂蚁在第n步行走后所处的位置。
【数据格式】
输入数据的第一行是 m n 两个整数(3 < m, n < 100),表示正方形格子的行数和列数。
接下来是 m 行数据。
每行数据为 n 个被空格分开的数字。0 表示白格,1 表示黑格。
接下来是一行数据:x y s k, 其中x y为整数,表示蚂蚁所在行号和列号(行号从上到下增长,列号从左到右增长,都是从0开始编号)。s 是一个大写字母,表示蚂蚁头的朝向,我们约定:上下左右分别用:UDLR表示。k 表示蚂蚁走的步数。
输出数据为两个空格分开的整数 p q, 分别表示蚂蚁在k步后,所处格子的行号和列号。
例如, 输入:
5 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
2 3 L 5
程序应该输出:
1 3
再例如, 输入:
3 3
0 0 0
1 1 1
1 1 1
1 1 U 6
程序应该输出:
0 0
public class Main {

//当前位置
private static int x;
private static int y;

private static int [][]a = new int[100][100];

//当前方向
private static int direction = 0;


public static void main(String[] args) {

Scanner cin = new Scanner(System.in);
int m,n;

m = cin.nextInt();
n = cin.nextInt();

for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
a[i][j] = cin.nextInt();
}

x = cin.nextInt();
y = cin.nextInt();

//将方向设置为数字  方向 U R D L
String dirtemp = cin.next();
if(dirtemp.equals("R"))
direction = 1;
else if(dirtemp.equals("D"))
direction = 2;
else if(dirtemp.equals("L"))
direction = 3;

//步数
int k = cin.nextInt();

for(int i=0;i<k;i++)
move();

System.out.print(x+" "+y);
}


// 移动的方法
public static void move() 
{
//如果是白的,则左转
if(a[x][y] == 0)
{
direction = (direction - 1) ;
if(direction < 0)
direction += 4;
a[x][y] = 1;
}

//如果是黑的则右转
else if(a[x][y] == 1)
{
direction = (direction + 1)%4;
a[x][y] = 0;
}

switch(direction)
{
case 0:
x--;
break;
case 1:
y++;
break;
case 2:
x++;
break;
case 3:
y--;
break;
}
}
}
https://en.wikipedia.org/wiki/Langton%27s_ant
Read full article from 蓝桥杯 - 兰顿蚂蚁 - 永不冷�龅娜松�

2014蓝桥杯B组c/c++预赛 第九题地宫取宝 (四维线性dp) - Tc_To_Top的专栏 - 博客频道 - CSDN.NET


2014蓝桥杯B组c/c++预赛 第九题地宫取宝 (四维线性dp) - Tc_To_Top的专栏 - 博客频道 - CSDN.NET
  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 2
1 2
2 1

样例输出
2

样例输入
2 3 2
1 2 3
2 1 5

样例输出
14
题目分析:数据量不大,考虑用四维dp,dp[i][j][ma][num]表示到点(i,j)时最大值为ma取得了num个宝贝的方法数,对于某个点如果它的宝藏值大于当前最大值,则我们可以取也可以不取,否则我们只能不取,因此转移方程:
if(ma < val[i][j])  dp[i] [j] [ val[i][j] ] [num + 1] = (dp[i] [j] [ val[i][j] ] [num + 1] + dp[i - 1] [j] [ma] [num] + dp[i] [j - 1] [ma] [num]) % MOD //取
dp[i] [j] [ma] [num] = (dp[i] [j] [ma] [num] + dp[i - 1] [j] [ma] [num] + dp[i] [j - 1] [ma] [num]) % MOD //不取 (这里没有else,因为不论我们能不能取,我们都可以选择不取),最后我们只要累加dp[n][m][各最大值][k]的值即可,初始dp[1][1][val[1][1]][1] = 1第一个点取,dp[1][1][0][0]第一点不取

这题还有两个坑点,第一:上述转移方程要分成两段写,因为是对1e9+7取模,我们考虑最坏的情况,括号里的数就可能超int。第二:宝物的价值有可能是0,因为初始化为0,因此混淆了空的点和价值为0的点,因此我们让每个宝藏的价值自增1
int dp[55][55][15][15]; int val[55][55]; int main() { int n, m, k; scanf("%d %d %d", &n, &m, &k); for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { scanf("%d", &val[i][j]); val[i][j] ++; } } memset(dp, 0, sizeof(dp)); dp[1][1][val[1][1]][1] = 1; dp[1][1][0][0] = 1; for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { if(i == 1 && j == 1) continue; for(int num = 0; num <= k; num++) { for(int ma = 0; ma <= 13; ma++) { if(ma < val[i][j]) { dp[i][j][val[i][j]][num + 1] = (dp[i][j][val[i][j]][num + 1] + dp[i - 1][j][ma][num]) % MOD; dp[i][j][val[i][j]][num + 1] = (dp[i][j][val[i][j]][num + 1] + dp[i][j - 1][ma][num]) % MOD; } dp[i][j][ma][num] = (dp[i][j][ma][num] + dp[i - 1][j][ma][num]) % MOD; dp[i][j][ma][num] = (dp[i][j][ma][num] + dp[i][j - 1][ma][num]) % MOD; } } } } int ans = 0; for(int i = 0; i < 13; i++) ans = (ans + dp[n][m][i][k]) % MOD; printf("%d\n", ans); }
首先,先来谈第一个问题,写出其状态转移方程,我们要求的解是从原点手握价值最大的宝物v开始经过不同的路径到终点获得K件宝物的路径总数,我们姑且将此状态记为
d(1,1,k(初始为0,还没拿宝贝),-1(此时手上没有宝物,值记为-1))
那么从此状态出发,可以将其转移为如下的决策
 
这里在补充说明用状态转移方程可以方便将原问题分解成若干个与原问题相同的子问题,且规模变小。
第二个问题,如果仅仅这样的话,必然存在重复计算的问题,为此必须要采取记忆化搜索的方式,对于已经计算过的结点保存其值,就这条题目而言,必须要用一个四维数组保存,因为它的状态跟位置,个数以及当前最大的宝物价值有关。当重复遍历这个结点时,直接传值。
第三个问题,细节决定成败!!
1.类型用long long稳妥,因为即使MOD了,但是如果两个数加起来还有可能超int。
2.我自己做的时候没注意的一个小错误,导致最后始终不对的疏忽。我错误的把r[MAXN][MAXN][15][15]的初始化为了0,这绝对不正确,因为有可能以某种方式走的状态就是无解,就是0,必须将初始值赋为-1。
3.对于有宝物的初始价值为-1,比较好的处理方式是,最后存放是第四维的下标后移一位
4.这里还要注意,k最多是13,不会超过这个值,所以第三维只要14就够了
 4 #define MAXN 60
 5 #define MOD %1000000007 
 6 using namespace std;
 7 long long r[MAXN][MAXN][15][15];//保存状态 
 8 long long map[MAXN][MAXN];//初始地图 
 9 long long m,n,num;
10 long long dfs(long long i,long long j,long long k,long long v)
11 {
12     long long s=0,t;
13     if(r[i][j][k][v+1]!=-1)
14         return r[i][j][k][v+1];
15     if(i==m&&j==n)//到达终点 
16     {
17         if(k==num)
18         {
19             r[m][n][k][v+1]=1;
20             return r[m][n][k][v+1];
21         }
22         else if(k==num-1&&map[m][n]>v)
23         {
24             r[m][n][k][v+1]=1;
25             return r[m][n][k][v+1];
26         }
27         else
28         {
29             r[m][n][k][v+1]=0;
30             return r[m][n][k][v+1];
31         }
32     }
33     else
34     {
35         if(map[i][j]>v)
36         {
37             t=map[i][j];
38             if(i+1<=m)
39             s=(s+dfs(i+1,j,k+1,t)MOD+dfs(i+1,j,k,v)MOD)MOD;
40             if(j+1<=n)
41             s=(s+dfs(i,j+1,k+1,t)MOD+dfs(i,j+1,k,v)MOD)MOD;
42         }
43         else
44         {
45             if(i+1<=m)
46             s=(s+dfs(i+1,j,k,v)MOD)MOD;
47             if(j+1<=n)
48             s=(s+dfs(i,j+1,k,v)MOD)MOD;
49         }
50         r[i][j][k][v+1]=s MOD;
51         return r[i][j][k][v+1];
52     }
53 }
54 int main()
55 {
56 //    freopen("data.in","r",stdin);
57 //    freopen("data.out","w",stdout);
58     memset(r,-1,sizeof(r));
59     long long i,j,p,q;
60     cin>>m>>n>>num;
61     for(i=1;i<=m;i++)
62         for(j=1;j<=n;j++)
63             cin>>map[i][j];
64     dfs(1,1,0,-1);
65     cout<<r[1][1][0][0]<<endl;    
66     return 0;
67 }
http://www.zhuangjingyang.com/%E8%93%9D%E6%A1%A5%E6%9D%AF-%E5%9C%B0%E5%AE%AB%E5%8F%96%E5%AE%9D.html
public class Main
{
 //定义四维数组 分别表示x,y,num,maxvalue;
 private static int[][][][] a = new int[51][51][13][14];
 private static int n;
 private static int m;
 private static int k;
 
 private final static int N = 1000000007;
 
 //输入矩阵
 private static int[][] t = new int[51][51];
 
 public static void main(String[] args)
 {
  Scanner cin = new Scanner(System.in);
  n = cin.nextInt();
  m = cin.nextInt();
  k = cin.nextInt();
  
  // 赋值数组
  for(int i=0;i<n;i++)
  {
   for(int j=0;j<m;j++)
    t[i][j] = cin.nextInt();
  }
  
  //将dfs数组值初始化为-1
  for(int i=0;i<51;i++)
   for(int j=0;j<51;j++)
    for(int k=0;k<13;k++)
     for(int l=0;l<13;l++)
      a[i][j][k][l] = -1;
  
  
  int res = dfs(0,0,0,-1);
  System.out.println(res);
 }
 
 public static int dfs(int x,int y,int num,int maxvalue)
 {
  //如果不为-1了,说明这里的值已经计算过了可以直接返回了。
  if(a[x][y][num][maxvalue + 1] !=  -1)
   return a[x][y][num][maxvalue + 1] ; 
  int res = 0;
  
  //抵达终点,对于最后这个节点,如果是满足条件的节点的话,返回1。
  if(x==n-1 && y==m-1)
  {
   //两种情况,最后一个节点的能拿与不能拿
   if( t[x][y] <= maxvalue) // 小于等于,不能拿
   {
    if(num == k )
     res++;
   }
   //能拿
   else 
   {
    //是否满足条件
    if(num==k-1 || num==k)
     res++;
   }
  }
  
  //还未到达终点,dfs ,深度先
  if(x+1<n)
  {
   //对于当前节点能不能拿
   //能拿
   if(t[x][y] > maxvalue )
   {
    //能拿还要分为是否拿
    res+=dfs(x+1,y,num+1,t[x][y]); // 拿
    res%=N;
    
    //不拿的
    res+= dfs(x+1,y,num,maxvalue);
    res%=N;
   }
   
   //不能拿
   else
   {
    res+= dfs(x+1,y,num,maxvalue);
    res%=N;
   }
  }
  
  //广度
  if(y+1<m)
  {
   //和深度差不多一样,就是换成广度的搜索了
   
   //判断能不能拿
   
   if(maxvalue < t[x][y])
   {
    //拿
    res+=dfs(x,y+1,num+1,t[x][y]);
    res%=N;
    //不拿
    res+=dfs(x,y+1,num,maxvalue);
    res%=N;
   } 
   else
   {
    res+=dfs(x,y+1,num,maxvalue);
    res%=N;
   }
  }
  //返回从该节点起的计数
  a[x][y][num][maxvalue + 1] = res;
  return a[x][y][num][maxvalue + 1];
 } 
}
http://mojijs.com/2014/09/157442/index.html
public class 地宫取宝 {
 static int m,n,k;
 static int count=0;//拥有的方案的数量
 public static void main(String[] args) { 
 Scanner sc=new Scanner(System.in);
 n=sc.nextInt();
 m=sc.nextInt();
 int[][] digong=new int[n][m];
 k=sc.nextInt();
 for(int i=0;i<n;i++)
 {
  for(int j=0;j<m;j++)
  {
   digong[i][j]=sc.nextInt();
  }
 }
 dsf(digong,0,0,0,0);
 print("有"+count+"种行动方案");
 long start = System.currentTimeMillis();
 
  long end = System.currentTimeMillis();
  print("此程序运行,花费的时间是" + ((end - start) / 1000.0) + "秒.");
 }
    //参数分别代表地宫数组当前拥有的宝贝数量have,当前所在的所标i/j,当前的单个宝贝的价值最大值
 public static void dsf(int[][] digong,int have,int i,int j,int max){
  if(i==n-1&&j==m-1)
  {
   //如果走到了最后一格
   if(have==k) count++;
   else if(have==k-1&&max<digong[i][j]) count++;
   
   if(count>1000000007)
    count=count00000007;
  }
  else{//四种行走方式
   if(i<n-1)
   dsf(digong,have,i+1,j,max);//不拿宝贝向下走
   if(j<m-1)
   dsf(digong,have,i,j+1,max);//不拿宝贝向右走
   if(max<digong[i][j]&&i<n-1)
   {
   dsf(digong,have+1,i+1,j,digong[i][j]);//拿宝贝向下走
   }
   if(max<digong[i][j]&&j<m-1)
   {
   dsf(digong,have+1,i,j+1,digong[i][j]);//拿宝贝向右走
   }
   
  }
  
 }

蓝桥杯-----世纪末的星期 - crazy_jack - 博客频道 - CSDN.NET


蓝桥杯-----世纪末的星期 - crazy_jack - 博客频道 - CSDN.NET
曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。
还有人称今后的某个世纪末的12月31日,如果是星期一则会....
有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!!
于是,"谣言制造商"又修改为星期日......
1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?



请回答该年份(只写这个4位整数,不要写12月31等多余信息)

分析:

该题就是计算"xx99"年距离2000.1.1有几天。例如:2000.1.1距离1999.12.31有一天,则2000.1.1是星期(1+5)%7 = 6,是星期六。则只需计算出xx99.12.31距离2000.1.1的天数,再加上5余7,然后判断余数是否是0就OK了!
 public static void main(String[] args)
 {
  int year = 2000;
  int total = 0;
  for( ; ; year++)
  {
   if(year%400==0 || (year%4==0 && year%100!=0))
   {
    total += 366;
   }
   else
   {
    total += 365;
   }
   if((total+5)%7 == 0 && (year+"").endsWith("99"))
   {
    System.out.println(year);
    break;
   }
  }
 }
Read full article from 蓝桥杯-----世纪末的星期 - crazy_jack - 博客频道 - CSDN.NET

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts