题意:给定一串序列,判断其是否是合法的N皇后方案。
思路:本题是阅读理解题,不是真的N皇后问题。N皇后问题的合法序列要求任意两个皇后不在同一行、同一列,以及不在对角线。本题已经明确不会在同一列,故只需要判断是否在同一行和是否在对角线即可。
代码:
#include <cstdio> #include <cstdlib> int table[1010];//table[i]=j表示第i列,第j行 int main() { int k,n; scanf("%d",&k); while(k--){ scanf("%d",&n); bool flag=true; for(int c=1;c<=n;c++){ scanf("%d",&table[c]); if(flag==false) continue; for(int i=1;i<c;i++){ if(table[c]==table[i] || abs(table[c]-table[i])==c-i){//注意加绝对值 flag=false; break; } } } printf("%s\n",flag?"YES":"NO"); } return 0; }
【补充:求解8皇后问题】
假设棋牌的方向是这样的,按列放入皇后,问总共有多少中合理的方案?
代码:
#include <cstdio> #include <cstdlib> const int n=8; int table[n]={0};//table[i]=j表示第i列,第j行 int totalCnt=0;//总的方案数 //求8皇后问题,逐列放入皇后 void dfs(int x) { if(x==n){ totalCnt++; for(int i=0;i<n;i++)//输出方案 printf("%d ",table[i]); printf("\n"); return; } for(int y=0;y<n;y++){ table[x]=y;//把皇后放在位置(x,y)处 bool flag=true; for(int i=0;i<x;i++){//检查该位置是否合法 if(table[i]==table[x] || abs(table[x]-table[i])==x-i) { flag=false; break; } } if(flag)//如果皇后放在第x列是合理的,就进入下一列 dfs(x+1); } } int main() { dfs(0); printf("total solutions:%d\n",totalCnt); return 0; }
原文地址:https://www.cnblogs.com/kkmjy/p/9574009.html
时间: 2024-11-11 00:39:03