Sudoku (POJ - 3074,DFS + 位运算优化)

一.题目链接:

POJ-3074

二.题目大意:

就是普通的数独问题.

三.分析:

暂时没学跳舞链,这里用 dfs 写了一下.

这里需要预处理出好多东西,不然 T 死你.

以及各种优化,二进制 + 位运算 和 每次优先选取可能数少的点.

详见代码.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define lc k * 2
#define rc k * 2 + 1
#define pi acos(-1.0)
#define ll long long
#define ull unsigned long long
using namespace std;

const int M = (int)1e6;
const int mod = 99991;
const int inf = (1<<9) - 1;

char str[81];
char mp[10][10];
int num[inf + 1];///状态 U 的选择数
map <int, int> figure;///处理出 2^n
int row[10], col[10], grid[10];
int id[10][10] =
{
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 1, 1, 1, 2, 2, 2, 3, 3, 3},
    {0, 1, 1, 1, 2, 2, 2, 3, 3, 3},
    {0, 1, 1, 1, 2, 2, 2, 3, 3, 3},
    {0, 4, 4, 4, 5, 5, 5, 6, 6, 6},
    {0, 4, 4, 4, 5, 5, 5, 6, 6, 6},
    {0, 4, 4, 4, 5, 5, 5, 6, 6, 6},
    {0, 7, 7, 7, 8, 8, 8, 9, 9, 9},
    {0, 7, 7, 7, 8, 8, 8, 9, 9, 9},
    {0, 7, 7, 7, 8, 8, 8, 9, 9, 9}
};///grid的坐标转换

int lowbit(int x)
{
    return x&(-x);
}

void init()
{
    int cnt;
    for(int i = 0; i <= inf; ++i)
    {
        cnt = 0;
        for(int j = i; j; j -= lowbit(j))
            ++cnt;
        num[i] = cnt;
    }
    for(int i = 0; i < 9; ++i)
        figure[1<<i] = i + 1;
}

void work()
{
    for(int i = 1; i <= 9; ++i)
        row[i] = col[i] = grid[i] = inf;
    for(int i = 1; i <= 9; ++i)
    {
        for(int j = 1; j <= 9; ++j)
        {
            mp[i][j] = str[(i - 1) * 9 + j - 1];
            if(mp[i][j] == '.')
                mp[i][j] = '0';
            else
            {
                row[i] ^= 1<<(mp[i][j] - '1');
                col[j] ^= 1<<(mp[i][j] - '1');
                grid[id[i][j]] ^= 1<<(mp[i][j] - '1');
            }
        }
        mp[i][10] = '\0';
    }
}

pair <int, int> get_min()
{
    int x, y, Min, U;
    x = y = Min = 10;
    for(int i = 1; i <= 9; ++i)
    {
        for(int j = 1; j <= 9; ++j)
        {
            if(mp[i][j] != '0')
                continue;
            U = row[i] & col[j] & grid[id[i][j]];
            if(!U)
                return make_pair(-1, -1);
            if(num[U] < Min)
            {
                Min = num[U];
                x = i, y = j;
            }
        }
    }
    return make_pair(x, y);
}

bool dfs(int x, int y)
{
    int U = row[x] & col[y] & grid[id[x][y]];
    for(int i = U; i; i -= lowbit(i))
    {
        mp[x][y] = figure[lowbit(i)] + '0';
        row[x] ^= lowbit(i);
        col[y] ^= lowbit(i);
        grid[id[x][y]] ^= lowbit(i);
        pair <int, int> p = get_min();
        if(p.first == -1)
        {
            mp[x][y] = '0';
            row[x] ^= lowbit(i);
            col[y] ^= lowbit(i);
            grid[id[x][y]] ^= lowbit(i);
            continue;
        }
        if(p.first == 10 || dfs(p.first, p.second))
            return 1;
        mp[x][y] = '0';
        row[x] ^= lowbit(i);
        col[y] ^= lowbit(i);
        grid[id[x][y]] ^= lowbit(i);
    }
    return 0;
}

/**
.2738..1..1...6735.......293.5692.8...........6.1745.364.......9518...7..8..6534.
......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3.
end
**/

int main()
{
//    freopen("input.txt", "r", stdin);
    init();
    while(~scanf("%s", str) && str[0] != 'e')
    {
        work();
        pair <int, int> p = get_min();
        dfs(p.first, p.second);
        for(int i = 1; i <= 9; ++i)
            printf("%s", mp[i] + 1);
        printf("\n");
    }
//    fclose(stdin);
    return 0;
}

 

内容概要:本文介绍了一个基于MATLAB实现的无人机三维路径规划项目,采用蚁群算法(ACO)与多层感知机(MLP)相结合的混合模型(ACO-MLP)。该模型通过三维环境离散化建模,利用ACO进行全局路径搜索,并引入MLP对环境特征进行自适应学习与启发因子优化,实现路径的动态调整与多目标优化。项目解决了高维空间建模、动态障碍规避、局部最优陷阱、算法实时性及多目标权衡等关键技术难题,结合并行计算与参数自适应机制,提升了路径规划的智能性、安全性和工程适用性。文中提供了详细的模型架构、核心算法流程及MATLAB代码示例,涵盖空间建模、信息素更新、MLP训练与融合优化等关键步骤。; 适合人群:具备一定MATLAB编程基础,熟悉智能优化算法与神经网络的高校学生、科研人员及从事无人机路径规划相关工作的工程师;适合从事智能无人系统、自动驾驶、机器人导航等领域的研究人员; 使用场景及目标:①应用于复杂三维环境下的无人机路径规划,如城市物流、灾害救援、军事侦察等场景;②实现飞行安全、能耗优化、路径平滑与实时避障等多目标协同优化;③为智能无人系统的自主决策与环境适应能力提供算法支持; 阅读建议:此资源结合理论模型与MATLAB实践,建议读者在理解ACO与MLP基本原理的基础上,结合代码示例进行仿真调试,重点关注ACO-MLP融合机制、多目标优化函数设计及参数自适应策略的实现,以深入掌握混合智能算法在工程中的应用方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值