2n皇后问题
2017-08-01 17:34
176 查看
点击打开链接
给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。
现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。
问总共有多少种放法?
输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
n小于等于8。
输出一个整数,表示总共有多少种放法。
4
1011
1111
1111
1111
蓝桥杯
解析:一个简单的DFS,主要考虑清楚皇后应该放的位置。
题目描述
给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。
问总共有多少种放法?
输入
输入的第一行为一个整数n,表示棋盘的大小。接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
n小于等于8。
输出
输出一个整数,表示总共有多少种放法。
样例输入
4 1111 1111 11111111
4
1011
1111
1111
1111
样例输出
2 0
来源
蓝桥杯解析:一个简单的DFS,主要考虑清楚皇后应该放的位置。
#include<stdio.h> int n,num=0,s[10][10]; char m[10][10]; bool check(int x,int y,int que) { int i,j; for(i=x-1;i>=0;i--){ if(s[i][y]==que) return false; } for(i=x-1,j=y-1;i>=0&&j>=0;i--,j--){ if(s[i][j]==que) return false; } for(i=x-1,j=y+1;i>=0&&j<n;i--,j++){ if(s[i][j]==que) return false; } return true; } void dfs(int i,int que){ if(i==n){ if(que==2) dfs(0,3); else num++; //此处的else一定不能省略,否则会造成重复num++。结果变大一倍以上。 return ; } for(int j=0;j<n;j++){ if(s[i][j]!=1) continue; if(check(i,j,que)){ s[i][j]=que; dfs(i+1,que); s[i][j]=1; } else continue; } return ; } int main() { while(~scanf("%d",&n)){ num=0; for(int i=0;i<n;i++){ scanf("%s",m[i]); for(int j=0;j<n;j++) s[i][j]=m[i][j]-'0'; } dfs(0,2); printf("%d\n",num); } }