蓝桥杯:java【思特奇杯·云上蓝桥-算法集训营】第2周

题目描述

 代码

package lan2;

import java.util.Scanner;

public class demo1 {
    public static int a;
    public static int b[]={1,2,3,4,5,6,7,8,9};
    public static int count=0;
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        a=in.nextInt();
        dfs(0);
        System.out.println(count);

    }
    public static void dfs(int index)
    {
        if(index==b.length)
        {
            if(check(b))
            {count++;}
            return;
        }
        for(int i=index;i<b.length;i++)
        {
            swap(b,index,i);
            dfs(index+1);
            swap(b,index,i);
        }
    }
    public static void swap(int a[],int i,int j)
    {
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
    public static boolean check(int b[])//N<1000*1000,所以加号之前最多是6位数
    {
        for(int i=0;i<6;i++)//加号之前的数
        {
            int jiafa=change(0,i);
            if(jiafa>=a)
                continue;
            for(int j=i+1;j<8;j++)//被除数
            {
                int beichushu=change(i+1,j);
                int chushu=change(j+1,8);
                if(beichushu%chushu==0 && jiafa+beichushu/chushu==a)
                    return true;
            }
        }
        return false;
    }
    public static int change(int i,int j)
    {
        int sum=0;
        int a=1;
        for(int c=j;c>=i;c--)
        {
            sum+=b[c]*a;
            a=a*10;
        }
        return sum;
    }
}

 二

题目描述

 代码

package lan2;
public class demo2{
    public static int count=0;
    public static void main(String[] args) {
        digui(5,9,2);
        System.out.println(count);

    }
    public static void digui(int a,int b,int c)//a代表遇到店,b代表遇到花,3代表原来的2斗酒
    {
        if(a>0)
            digui(a-1,b,c*2);
        if(b>0)
            digui(a,b-1,c-1);
        if(a==0 && b==0 && c==1)
            count++;
    }
}

 三

题目描述

 代码

package lan2;

public class demo3 {
    public static void main(String[] args) {
        int a[][]=new int[40][2];
        a[1][0]=1;
        a[1][1]=0;
        a[2][0]=1;
        a[2][1]=1;
        for(int i=3;i<40;i++)
        {
            a[i][0]=a[i-1][1]+a[i-2][1];
            a[i][1]=a[i-1][0]+a[i-2][0];
        }
        System.out.println(a[39][1]);
    }
}

 四

题目描述

 代码

package lan2;

import java.util.Scanner;

public class demo4 {
    public static char a[][];
    static int n;
    public static int count=Integer.MAX_VALUE;
    public static boolean mark[][];
    public static int[][] direction={{1,0},{0,1},{-1,0},{0,-1}};
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        a=new char[n][n];
        mark=new boolean[n][n];
        int x=0,y=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                a[i][j]=in.next().charAt(0);
                if(a[i][j]=='A')
                {
                    x=i;
                    y=j;
                }
            }
        }
        dfs(x,y,0);
        System.out.println(count);
    }
    public static void dfs(int x,int y,int count1)
    {
        if(count1>=count)
            return;
        if(a[x][y]=='B')
        {
            count=count1;
            return;
        }
        mark[x][y]=true;
        for(int i=0;i<4;i++)
        {
            int x1=x+direction[i][0];
            int y1=y+direction[i][1];
            if(x1<0 || x1>=n || y1<0 || y1>=n)
                continue;
            if(a[x1][y1] != a[x][y] && mark[x1][y1]==false)
                dfs(x1,y1,count1+1);
        }
        mark[x][y]=false;
    }
}

题目描述

 代码

package lan2;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
class Node1{
    int x;
    int y;
    int length;
    String ss;
    public Node1(int x,int y,int z,String ss)
    {
        this.x=x;
        this.y=y;
        length=z;
        this.ss=ss;
    }
}
class demo5{
    static char[][] arr=new char[30][50];
    static int[][] mark=new int[30][50];
    static char[] C={'D','L','R','U'};
    static LinkedList<Node1> queue=new LinkedList();
    static int[][] direction={{1,0},{0,-1},{0,1},{-1,0}};
    static char[] c={'D', 'L', 'R', 'U'};
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        for(int i=0;i<30;i++)
        {
            String s=in.nextLine();
            for(int j=0;j<50;j++)
                arr[i][j]=s.charAt(j);
        }
        bfs();
        System.out.println();

    }
    private static void bfs()
    {
        Node1 node=new Node1(0,0,0,"");
        queue.add(node);
        mark[0][0]=1;
        while (!queue.isEmpty())
        {
            node=queue.poll();
            if(node.x==29 && node.y==49)
            { System.out.println(node.length);
                System.out.println(node.ss);
            }
            for(int i=0;i<4;i++)
            {
                int x1=node.x+direction[i][0];
                int y1=node.y+direction[i][1];
                if(x1>=0 && x1<30 && y1>=0 && y1<50 && arr[x1][y1]=='0' && mark[x1][y1]==0)
                {

                    mark[x1][y1]=1;
                    Node1 node1=new Node1(x1,y1,node.length+1,node.ss+c[i]);
                    queue.add(node1);

                }
            }
        }
    }
}

 六

题目描述

 代码

package lan2;

import java.util.LinkedList;
import java.util.Scanner;

public class demo6 {
    public static boolean [][] mark=new boolean[8][8];
    public static int count=Integer.MAX_VALUE;
    public static int direction[][]={{1,2},{1,-2},{2,-1},{2,1},{-2,1},{-2,-1},{-1,-2},{-1,2}};
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int x1=in.nextInt();
        int y1=in.nextInt();
        int x2=in.nextInt();
        int y2=in.nextInt();
        System.out.println(bfs(x1,y1,x2,y2));
    }
    public static int  bfs(int a,int b,int c,int d)
    {
        if(a==c && b==d)
            return 0;
        LinkedList<int[]> queue=new LinkedList<>();
        queue.add(new int[]{a,b,0});
        mark[a][b]=true;
        while (!queue.isEmpty())
        {
            int [] p=queue.pollFirst();
            a=p[0];
            b=p[1];
            if(a== c && b==d)
                break;
            for(int i=0;i<direction.length;i++)
            {
                int x=a+direction[i][0];
                int y=b+direction[i][1];
                if(x<0 || x>7 || y<0 || y>7)
                    continue;
                if(mark[x][y])
                    continue;
                queue.add(new int[]{x,y,p[2]+1});
                mark[x][y]=true;
                if(x==c && y==d)
                    count=Math.min(count,p[2]+1);
            }
        }
        return count;
    }
}

 七

题目描述

 

 代码

package lan2;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class demo7 {
    private static int []north;
    private static int []west;
    private static int [][]mark;
    private static int n;
    private static int [][]direction={{0,1},{1,0},{-1,0},{0,-1}};
    private static List<Integer> list=new ArrayList<>();
    public static void main(String[] args) {
        Scanner in= new Scanner(System.in);
        n=in.nextInt();
        north=new int[n];
        west=new int[n];
        mark=new int[n][n];
        for(int i=0;i<n;i++)
            north[i]=in.nextInt();
        for(int j=0;j<n;j++)
            west[j]=in.nextInt();
        mark[0][0]=1;
        north[0]--;
        west[0]--;
        list.add(0);
        dfs(0,0,0);


    }
    private static void dfs(int x,int y,int num)
    {
        if(x==n-1 && y==n-1)
        {
            for(int i=0;i<n;i++)
            {
                if(north[i]!=0 || west[i]!=0)
                    return;
            }
            for(int j=0;j<=num;j++)
            {
                System.out.print(list.get(j)+" ");
            }
            return;
        }

        for(int k=0;k<4;k++)
        {
            int x1=x+direction[k][0];
            int y1=y+direction[k][1];
            if(x1>=0 && x1<n &&  y1<n && y1>=0 && mark[x1][y1]==0 && west[x1]>0&&north[y1]>0 )
            {
                mark[x1][y1]=1;
                north[y1]--;
                west[x1]--;
                list.add(x1*n+y1);
                dfs(x1,y1,num+1);
                list.remove(list.size()-1);
                mark[x1][y1]=0;
                north[y1]++;
                west[x1]++;

            }
        }

    }
}

 八

题目描述

 代码

package lan2;

import java.util.Scanner;

public class demo8 {
    public static int count=0;
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int m=in.nextInt();
        int n=in.nextInt();
        int o=0;
        f(m,n,o);
        System.out.println(count);
    }
    public static void f(int m,int n ,int o)
    {
        if(m<0 || n<0 || o<0)
            return;
        if(m==0 && n==0)
            count++;
        f(m-1,n,o+1);
        f(m,n-1,o-1);
    }
}

题目描述

 

 代码

package lan2;

import java.util.Scanner;
import java.util.*;
public class demo9{
    static int[] arr;
    static int[] visit;
    static int m;
    private static int count=0;
    static int max=0;
    static int a=0;
    static List<int[]> []listmap;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n=scanner.nextInt();
        listmap=new ArrayList[n+1];
        visit=new int[n+1];
        visit[1]=1;
        for (int i=1;i<=n;i++){
            listmap[i]=new ArrayList<>();
        }
        for (int i=0;i<n-1;i++){
            int x=scanner.nextInt();
            int y=scanner.nextInt();
            int z=scanner.nextInt();
            listmap[x].add(new int[]{y,z});
            listmap[y].add(new int[]{x,z});
        }
        // 直观打印邻接表
        for (int i=1;i<=n;i++){
            List<int[]> ints = listmap[i];
            for (int[] arr:ints){
                System.out.print(arr[0]+" "+ arr[1]+" ");
            }
            System.out.println();
        }
        dfs(1,0);
//        System.out.println(a);
        visit=new int[n+1];
        max=0;
        visit[a]=1;
        dfs(a,0);
        System.out.println((max+10+11)*max/2);
    }

    private static void dfs(int point, int dis) {
        if (dis>max){
            a=point;
            max=dis;
        }
        for (int i = 0; i <listmap[point].size(); i++) {
            int y=listmap[point].get(i)[0];
            if (visit[y]==1) continue;
            visit[y]=1;
            dis+=listmap[point].get(i)[1];
            dfs(y,dis);
            visit[y]=0;
            dis-=listmap[point].get(i)[1];
        }
    }


}

 十

题目描述

 代码

 

package lan2;

import java.util.Scanner;

public class demo10 {
    private static int x[][];
    private static int count=0;
    private static int n;
    private static int[] mark;
    private static int[] mark1;
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        mark=new int[n];
        mark1=new int[n];
        x=new int[n][n];
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
                x[i][j]=in.nextInt();
        }
        dfs(0);
        System.out.println(count);
    }
    private static void dfs(int index)
    {
        if(index==n)
        {

            dfs1(0);
            return;
        }
        for(int i=0;i<n;i++)
        {
            if(mark[index]!=1 && check(index,i) && x[index][i]!=0)
            {
                x[index][i]=2;
                mark[index]=1;
                dfs(index+1);
                mark[index]=0;
                x[index][i]=1;
            }
        }
    }
    private static void dfs1(int index)
    {
        if(index==n) {
            count++;
            return;
        }
        for(int i=0;i<n;i++)
        {
            if(mark1[index]!=1 && check1(index,i) && x[index][i]==1)
            {
                x[index][i]=3;
                mark1[index]=1;
                dfs1(index+1);
                mark1[index]=0;
                x[index][i]=1;
            }
        }
    }
    private static boolean check(int a,int b)
    {
        for(int i=a-1;i>=0;i--)
        {
            if(x[i][b]==2)
            {return false;}
            if((b-a+i)>=0 && (b-a+i)<n)
            {
                if(x[i][b-a+i]==2)
                {return false;}
            }
            if((a+b-i)>=0 && (a+b-i)<n)
            {
                if(x[i][a+b-i]==2)
                {return false;}
            }
        }
        return true;
    }
    private static boolean check1(int a,int b)
    {
        for(int i=a-1;i>=0;i--)
        {
            if(x[i][b]==3)
            {return false;}
            if((b-a+i)>=0 && (b-a+i)<n)
            {
                if(x[i][b-a+i]==3)
                {return false;}
            }
            if((a+b-i)>=0 && (a+b-i)<n)
            {
                if(x[i][a+b-i]==3)
                { return false;}
            }
        }
        return true;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值