zoukankan      html  css  js  c++  java
  • Java实现 蓝桥杯VIP 算法提高 棋盘多项式

      算法提高 棋盘多项式  

    时间限制:1.0s   内存限制:256.0MB
      棋盘多项式

    问题描述

      八皇后问题是在棋盘上放皇后,互相不攻击,求方案。变换一下棋子,还可以有八车问题,八马问题,八兵问题,八王问题,注意别念反。在这道题里,棋子换成车,同时棋盘也得换,确切说,是进行一些改造。比如现在有一张n*n的棋盘,我们在一些格子上抠几个洞,这些洞自然不能放棋子了,会漏下去的。另外,一个车本来能攻击和它的同行同列。现在,你想想,在攻击的过程中如果踩到一个洞,便会自取灭亡。故,车的攻击范围止于洞。
      此题,给你棋盘的规模n,以及挖洞情况,求放k个车的方案数(k从0到最多可放车数)

    输入格式

      第一行一个整数n表示棋盘大小
      接下来n行,每行n个用空格隔开的数字0或1,0的形状表示洞,1表示没有洞

    输出格式

      若干行,第i行表示放i个车的方案数

    样例输入

    3
    1 0 1
    1 1 1
    1 0 1

    样例输出

    7
    12
    4

    数据规模和约定

      n<=8

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    
    public class 棋盘多项式 {
    	static int[][] map;
    	static int n,k;
    	static int[] s;
    	
    	static boolean pd(int x,int y){
    		int i=x,j=y;
    		while (i>=0) {
    			if(map[i][j]==0)break;
    			if(map[i][j]==2)return false;
    			i--;
    		}
    		i=x;
    		while (j>=0) {
    			if(map[i][j]==0)break;
    			if(map[i][j]==2)return false;
    			j--;
    		}
    //		j=y;
    //		while(i>=0&&j>=0){
    //			if(map[i][j]==0)break;
    //			if(map[i][j]==2)return false;
    //			i--;j--;
    //		}
    //		i=x;j=y;
    //		while(i>=0&&j<n){
    //			if(map[i][j]==0)break;
    //			if(map[i][j]==2)return false;
    //			i--;j++;
    //		}
    		return true;
    	}
    	static int getNext(int x,int y){
    		if(x<n)
    		for (int i = y+1; i <n; i++) {
    			if(map[x][i]==0)return i+1;
    		}
    		return n;
    	}
    	static void tryC(int x,int y,int a){
    		//System.out.println(a);
    		s[a]++;
    		if(a>k)k=a;
    		//if(a==n)return;
    		int i1,j1;
    		for (int i = x; i < n; i++) {
    			int j=0;
    			if(i==x)j=y;
    			for (; j < n; j++) {
    				if(i==n||j==n)continue;
    				if(map[i][j]==0)continue;
    				if(pd(i, j)){
    					i1=i;j1=j;
    					map[i1][j1]=2;
    					j1=getNext(i, j);
    					if(j1==n){j1=0;i1++;}
    					tryC(i1, j1, a+1);
    					map[i][j]=1;
    				}
    			}
    		}
    	}
    	static void print(){
    		for (int i = 0; i < map.length; i++) {
    			for (int j = 0; j < map.length; j++) {
    				System.out.print(map[i][j]+" ");
    			}System.out.println();
    		}
    	}
    	public static void main(String[] args) throws NumberFormatException, IOException {
    		
    		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
    		n=Integer.parseInt(bf.readLine());
    		map=new int[n][n];
    		s=new int[100000];
    		for (int i = 0; i < n; i++) {
    			String[] a1=bf.readLine().split(" ");
    			for (int j = 0; j < n; j++) {
    				map[i][j]=Integer.parseInt(a1[j]);
    			}
    		}
    		//print();
    		tryC(0, 0, 0);
    		for (int i = 1; i <=k; i++) {
    			System.out.println(s[i]);
    		}
    		
    
    	}
    
    }
    
  • 相关阅读:
    申论1
    why factory pattern and when to use factory pattern
    jvm的字符串池
    is assembler instruction and machine instuction atomic
    jvm本身的多线程机制
    final
    java类的加载
    path和classpath的用途
    jar -cmf file1 file2 file3命令
    MANIFEST.MF中的MF是什么意思
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078234.html
Copyright © 2011-2022 走看看