poj1321

来源:互联网 发布:网络大电影众筹平台 编辑:程序博客网 时间:2024/06/06 18:24
涉及算法:深度搜索
题目大意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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;}}}}


0 0
原创粉丝点击