放棋子

来源:互联网 发布:yum install w3m 编辑:程序博客网 时间:2024/04/27 22:16

 今有 6 x 6 的棋盘格。其中某些格子已经预先放好了棋子。现在要再放上去一些,使得:每行每列都正好有3颗棋子。我们希望推算出所有可能的放法。 
 初始数组中,“1”表示放有棋子,“0”表示空白。

public class Test {public static int kind=0;public static int x[][] = new int[][]{{1,0,0,0,0,0},{0,0,1,0,1,0},{0,0,1,1,0,1},{0,1,0,0,1,0},{0,0,0,1,0,0},{1,0,1,0,0,1}};public static void dfs(int r,int c,int m,int n)//回溯{int row=place_row(r, m, n);if(r==m){kind++;show(m,n);}else if(row<3){for(int j=c;j<n;j++){if(x[r][j]==0 && place_col(j, m, n)) {x[r][j]=1;dfs(r,j+1,m,n);x[r][j]=0;}}}else if(row==3){dfs(r+1,0,m,n);}}public static int place_row(int row,int m,int n)//行是否能放{if(row==m) return row;int sum_row=0;for(int j=0;j<n;j++){sum_row+=x[row][j];if(sum_row>2)return 3;}return sum_row;}public static boolean place_col(int col,int m,int n)//列是否能放{int sum_col=0;for(int i=0;i<m;i++){sum_col+=x[i][col];if(sum_col>2)return false;}return true;}public static void show(int m,int n)//打印{System.out.println("kind:  "+kind);for(int i=0;i<m;i++){for(int j=0;j<n;j++){System.out.printf("%3d",x[i][j]);}System.out.println();}}public static void main(String[] args){dfs(0,0,6,6);System.out.println(kind);}}