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]);
		}
		

	}

}
原文地址:https://www.cnblogs.com/a1439775520/p/13078234.html