涉及算法:深度搜索
题目大意: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。棋盘有空白区域和棋盘区域,棋子只能放在棋盘区域
代码如下:
题目大意: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。棋盘有空白区域和棋盘区域,棋子只能放在棋盘区域
代码如下:
package com.solo.dfs;
import java.util.Scanner;
public class Main_1321
{
static int a,b;//a行a列的棋盘,棋子
static int[][] chess;//chess[i][j]:的值为0表示可以放棋子,值为1表示不可以放棋子
static int[] used;//used[i]:值为1表示,第i列已经放了棋子
static int mCount;//方案的次数
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
a=in.nextInt();
b=in.nextInt();
String s;
while(a!=-1 && b!=-1)
{
mCount=0;
used=new int[a+1];
chess=new int[a+1][a+1];
for (int i = 1; i <= a; i++)
{
s=in.next();
for (int j = 1; j <= a; j++)
{
if(s.charAt(j-1)=='#')
{
chess[i][j]=0;
}
else
{
chess[i][j]=1;
}
}
}
dfs(1, b);
System.out.println(mCount);
a=in.nextInt();
b=in.nextInt();
}
}
//dfs不可能会搜索到出现过的情况
static void dfs(int curRow,int resNum)//resNum:剩余棋子数目,curRow:当前行
{
if(resNum==0)
{
mCount++;
return;
}
if(a-curRow+1<resNum) return;
for(int i=curRow;i<=a;i++)
{
for(int j=1;j<=a;j++)
{
if(used[j]==1 || chess[i][j]==1) continue;
used[j]=1;
dfs(i+1, resNum-1);
used[j]=0;
}
}
}
}