NOJ1007八皇后问题

#include <iostream>
#include <cstdlib>
using namespace std;
int a[8];
int sum=0;
void print()
{
    int i,j;
    cout<<"No "<<sum<<":"<<endl;
    for(i=0;i<8;i++)
    {
        for(j=0;j<8;j++)
            {
                if(a[i]==j)
                    cout<<'A';
                    else
                        cout<<'.';
            }

        cout<<endl;
    }
}
int canplace(int row,int col)
{
    int i;
    for(i=0;i<row;i++)

    {
      if(a[i]==col||abs(i-row)==abs(a[i]-col)) //abs函数功能是求绝对值 ,之前的行的皇后没有在同一列上的,也没有在对角线上的 
                return 0;

    }
   return 1;
}
void search(int m)
{
    if(m==8)
    {
        sum++;
        print();
    }

    else
    {   int i;
        for(i=0;i<8;i++)
        {
            a[m]=i;
            if(canplace(m,i))//判断为1则执行花括号里的,为0则不执行 
            {
                search(m+1);//如果判断位置合适,放置一个皇后,进入下一行 
            }
        }
    }
}
int main()
{
    search(0);
    return 0;
}

### 南邮 NOJ 涂色问题的解题思路 涂色问题是典型的算法设计类题目,通常涉及图论中的染色模型或者动态规划方法。以下是针对此类问题的一种通用解决策略: #### 1. **问题建模** 假设涂色问题的目标是对某些区域进行着色,满足特定条件(如相邻区域颜色不同)。可以将其抽象为一个图结构,其中每个节点代表一个待涂色的对象,边表示对象之间的约束关系。 - 如果两个区域相邻,则它们之间存在一条边连接对应的节点。 - 颜色的选择可以通过回溯法或贪心算法来完成。 #### 2. **核心算法——回溯法** 回溯法是一种通过尝试所有可能的颜色组合并验证其合法性的方法。具体实现如下: ```c #include <stdio.h> #define MAX_N 100 // 假设最多有100个区域 int graph[MAX_N][MAX_N]; // 图的邻接矩阵 int color[MAX_N]; // 存储每个区域的颜色 int n, k; // n: 区域数;k: 可选颜色数 // 判断当前区域是否能使用某种颜色 bool isSafe(int node, int c) { for (int i = 0; i < n; ++i) { if (graph[node][i] && color[i] == c) { // 若相邻区域已有相同颜色 return false; } } return true; } // 主函数:递归调用 bool solve(int node) { if (node == n) { // 所有区域均已分配颜色 return true; } for (int c = 1; c <= k; ++c) { // 尝试每种颜色 if (isSafe(node, c)) { // 当前颜色安全 color[node] = c; // 给定区域赋值该颜色 if (solve(node + 1)) { // 进入下一个区域 return true; } color[node] = 0; // 回溯操作 } } return false; // 无法找到解决方案 } ``` 上述代码实现了基于回溯法的涂色方案生成器[^5]。 #### 3. **优化技巧** 为了提高效率,可以在以下几个方面改进: - 使用剪枝技术减少不必要的分支探索; - 对于大规模数据集,考虑采用启发式搜索或其他近似算法替代完全枚举。 --- ### 动态规划的应用场景 如果涂色问题具有重叠子问题特性(即多个状态共享相同的计算过程),则可引入动态规划降低时间复杂度。例如,在一维数组上的连续区间涂色时,定义`dp[i][j]`表示从前`i`个元素中选取部分进行涂色,并使最后一个被涂色的位置位于第`j`处所需的最小代价。 --- ### 总结 综上所述,南邮NOJ平台上的涂色问题主要考察选手对图论基础知识以及常见算法的理解程度。推荐优先掌握回溯法及其变体形式作为基础工具箱的一部分[^6]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值