0
点赞
收藏
分享

微信扫一扫

2*n皇后问题

小飞侠熙熙 2022-03-30 阅读 44
package first;

import java.util.Scanner;

public class HuangHou
{
	
	//白色 0 黑色 1
	static int m[][];//棋盘 0 不能放 1 能放
	static int r[][];//行标志
	static int l[][];//列标志
	static int d1[][];
	static int d2[][];
	static int n;
	static int sum=0;
	//0-白色  1-黑色
	public static void  f(int row,int color)
	{
		
		for(int i=1;i<=n;i++) 
		{
			if(m[row][i]==1&&r[row][color]==0&&l[i][color]==0&&d1[row+i][color]==0&&d2[row-i+n][color]==0) 
			{
				m[row][i]=0;
				r[row][color]=1;
				l[i][color]=1;
				d1[row+i][color]=1;
				d2[row-i+n][color]=1;
				
				if(row==n) {
					if(color==0)//白色放完了,那么就要放黑色
					{
						f(1,1);
					}else {
						sum++;
					}
				}else {
					f(row+1,color);
				}
				m[row][i]=1;
				r[row][color]=0;
				l[i][color]=0;
				d1[row+i][color]=0;
				d2[row-i+n][color]=0;
			}
		}
	}
	public static void main(String[] args) 
	{
		Scanner cin= new Scanner(System.in);
		n=cin.nextInt();
		m=new int[n*3][n*3];
		r=new int[n*3][2];
		l=new int[n*3][2];
		d1=new int[n*3][2];
		d2=new int[n*3][2];
		
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
			{
				m[i][j]=cin.nextInt();
			}
		f(1,0);
		System.out.println(sum);
	}

}

举报

相关推荐

0 条评论