藍橋杯題目9地宮取寶

package s3;

import java.util.Scanner;

import javax.swing.plaf.nimbus.State;

import org.omg.CORBA.PUBLIC_MEMBER;

public class test9 {

    /*
標題:地宮取寶

    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



*/
    static int jj=0;
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();
        int m=scan.nextInt();
        int k=scan.nextInt();
        int [][]s=new int[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                s[i][j]=scan.nextInt();
                
            }
        }
        String o="";//獲取值
        f(s,n,m,k,0,0,0,o);
        System.out.println(jj%1000000007);
        
    }

    public static void f(int s[][],int n,int m,int k,int sum,int x,int y,String o){
        if(x>=n||y>=m){
            return;
        }
        if(sum>k){
            return;
        }
        if(x==n-1&&y==m-1){            
            String o1=o+s[x][y];//最後一個取
            String o2=o;//最後一個不取
            char[] a=o1.toCharArray();
            int pan=0;//判斷用
            //System.out.println(o1);
            for(int i=0;i<a.length-1;i++){            
                for(int j=i+1;j<a.length;j++){
                    if(a[i]-'0'>=a[j]-'0'){
                        //System.out.println(a[i]+","+a[j]);
                        pan=1;
                        break;
                    }
                    
                }
                if(pan==1){
                    break;
                }
            }
            if(pan==0&&a.length==k){
                jj++;
                //System.out.println("dui"+o1);
            }
            //System.out.println();
            //System.out.println();
            //System.out.println();
            pan=0;//初始化判斷下一個
            char[] a1=o2.toCharArray();
            //System.out.println(a1);
            for(int i=0;i<a1.length-1;i++){            
                for(int j=i+1;j<a1.length;j++){
                    if(a1[i]-'0'>=a1[j]-'0'){
                        //System.out.println(a1[i]+","+a1[j]);
                        pan=1;
                        break;
                    }
                    
                }
                if(pan==1){
                    break;
                }
            }
            if(pan==0&&a1.length==k){
                jj++;
                //System.out.println("dui"+o2);
            }
            //System.out.println();
            //System.out.println();
            //System.out.println();
            return;
        }else{
            //不取
            f(s,n,m,k,sum,x+1,y,o);//下
            f(s,n,m,k,sum,x,y+1,o);//右
            //取
            f(s,n,m,k,sum+1,x+1,y,o+s[x][y]);//下
            f(s,n,m,k,sum+1,x,y+1,o+s[x][y]);//右

        }
        
    }
    

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章