解题思路:

注意事项:

参考代码:

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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论