问题描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横、坚、斜线位置。 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地。各皇后都有自己的势力范围,但也总能找到相安无事的办法。 所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死...... 现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个)。当然,皇后也不会攻击国王。 现在知道了国王的位置(x,y)(国王位于第x行第y列,x,y的起始行和列为1),请问,有多少种方案放置n个皇后,使她们不能互相攻击。 输入格式 一行,三个整数,皇宫的规模及表示国王的位置 输出格式 一个整数,表示放置n个皇后的方案数 样例输入 8 2 2 样例输出 10 数据规模和约定 n<=12
解答思路:从第一行开始放,然后检索这个位置是不是可以放皇后,判断这个位置是不是有皇上,再看看与他直接相连的是不是已经有了皇后
如果没有则可以放上皇后
如果检索完一次的话就可以加1 输出结果
1 #include <iostream> 2 using namespace std; 3 int c[13][13]; 4 int n; 5 int count=0; 6 int judge(int row, int col) //判断是否有皇后在一条直线上 7 { 8 int i,j; 9 for(i = row-1, j = col-1; i >= 1 && j >= 1; i --, j --){ 10 if(c[i][j] == 1){ 11 return 0; 12 } 13 } 14 for(i = row-1, j = col+1; i >= 1 && j <= n; i --, j ++){ 15 if(c[i][j] == 1){ 16 return 0; 17 } 18 } 19 for(i = row-1, j = col; i >= 1; i --){ 20 if(c[i][j] == 1){ 21 return 0; 22 } 23 } 24 /* for(m=1;m<=n;m++) 25 { 26 if(c[m][j]==1&&m!=i) 27 { 28 return 0; 29 } 30 } 31 for(o=1;o<=n;o++) 32 { 33 if(c[i][o]==1&&o!=n) 34 { 35 return 0; 36 } 37 }*/ 38 return 1; 39 } 40 41 void dfs(int i) 42 { 43 if(i>n) 44 { 45 count++; 46 } 47 else{ 48 for(int j=1;j<=n;j++) 49 { 50 if(c[i][j]==2)continue;//判断是不是有皇上 51 if(judge(i,j)) 52 { 53 c[i][j]=1; 54 dfs(i+1); 55 c[i][j]=0; 56 } else continue; 57 } 58 } 59 } 60 int main() 61 { 62 63 int x,y; 64 cin>>n; 65 cin>>x; 66 cin>>y; 67 for(int i=x-1;i<=x+1;i++) 68 { 69 for(int j=y-1;j<=y+1;j++) 70 { 71 c[i][j]=2; 72 } 73 } 74 dfs(1); 75 cout<<count; 76 }