解题思路:
注意事项:
参考代码:
import java.util.Scanner;
public class llq1{
static int n,ans;
static int[][]a=new int[10][10];
static int vis_white_lie[]=new int[10];
static int vis_white_left[]=new int[20];
static int vis_white_right[]=new int[20];
static int white[][]=new int[10][10];
static int vis_black_lie[]=new int[10];
static int vis_black_left[]=new int[20];
static int vis_black_right[]=new int[20];
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
n=s.nextInt();
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
a[i][j]=s.nextInt();
}
}
dfs_white(1);
System.out.println(ans);
}
private static void dfs_white(int x) {
//先考虑白皇后,再考虑黑皇后,每完成一种情况就dfs_black递归找黑皇后的情况
if(x==n+1)//白皇后已经完成了n行,准备进入第n+1行就是白皇后已经放完了
{
dfs_black(1);//递归调用黑皇后
return;
}
for(int i=1;i<=n;i++) {
if(vis_white_lie[i]==0&&vis_white_left[x+i]==0&&vis_white_right[x-i+n]==0&&a[x][i]!=0) {
//如果列,左斜线,右斜线都没有被占用,并且格子不为0
{
vis_white_lie[i]=1;
vis_white_left[x+i]=1;//左斜线x,y相加相等
vis_white_right[x-i+n]=1;//右斜线x,y坐标相减相等
white[x][i]=1;//将白皇后占的格子标记上,用于禁止黑皇后使用
dfs_white(x+1);//尝试第x+1行
vis_white_lie[i]=0;
vis_white_left[x+i]=0;
vis_white_right[x-i+n]=0;
white[x][i]=0;
}
}
}
}
private static void dfs_black(int x) {
// TODO Auto-generated method stub
if(x==n+1)
{
ans++;
return;
}
for(int i=1;i<=n;i++) {
if(vis_black_lie[i]==0&&vis_black_left[x+i]==0&&vis_black_right[x-i+n]==0&&a[x][i]!=0&&white[x][i]==0) {
//如果列,左斜线,右斜线都没有被占用,并且格子不为0,不被白皇后占用
{
vis_black_lie[i]=1;
vis_black_left[x+i]=1;//左斜线x,y相加相等
vis_black_right[x-i+n]=1;//右斜线x,y坐标相减相等
dfs_black(x+1);//尝试第x+1行
vis_black_lie[i]=0;//回溯
vis_black_left[x+i]=0;
vis_black_right[x-i+n]=0;
}
}
}
}
}
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:439 |
回文数(一) (C语言代码)浏览:753 |
【偶数求和】 (C语言代码)浏览:646 |
WU-输入输出格式练习 (C++代码)浏览:1082 |
C二级辅导-统计字符 (C语言代码)浏览:481 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:360 |
P1002 (C语言代码)浏览:963 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:501 |
1074题 初学者,求帮忙看下,不知道哪错了浏览:291 |
兰顿蚂蚁 (Java代码)浏览:949 |