博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3239解题报告
阅读量:4204 次
发布时间:2019-05-26

本文共 2114 字,大约阅读时间需要 7 分钟。

传说中的N皇后问题,不过这道题只要求一组满足条件的解。如果按照通用的递归回溯算法会在n比较大的时候超时。所以有两个思路:

一是随机产生一个1~N的排列,如果满足条件(斜行不冲突),则输出;否则,交换两个元素的位置减少冲突,如果冲突可以减为0,则输出,否则重新生成随机排列。解法见。

另一种思路是构造解。见。可以以0ms过测试。原理见。(声明:我看不进去啊。。。只能知其然不知其所以然。。。)

代码如下:

#include 
using namespace std;void print(int sol[], int n){ for(int i = 0; i < n; ++i) { cout<
>n; if(n == 0) return 0; if(n % 6 != 2&& n % 6 != 3) { int cnt = 0; for(int i = 2; i <= n; i += 2) { sol[cnt] = i; cnt++; } for(int i = 1; i <= n; i += 2) { sol[cnt] = i; cnt++; } } else { int k; if(n % 2 == 0) k = n / 2; else k = (n - 1) / 2; if(n % 2 == 0 && k % 2 == 0) { int cnt = 0; for(int i = k; i <= n; i += 2) { sol[cnt] = i; cnt++; } for(int i = 2; i <= k - 2; i += 2) { sol[cnt] = i; cnt++; } for(int i = k + 3; i <= n - 1; i += 2) { sol[cnt] = i; cnt++; } for(int i = 1; i <= k + 1; i += 2) { sol[cnt] = i; cnt++; } } else if(n % 2 == 1 && k % 2 == 0) { int cnt = 0; for(int i = k; i <= n - 1; i += 2) { sol[cnt] = i; cnt++; } for(int i = 2; i <= k - 2; i += 2) { sol[cnt] = i; cnt++; } for(int i = k + 3; i <= n - 2; i += 2) { sol[cnt] = i; cnt++; } for(int i = 1; i <= k + 1; i += 2) { sol[cnt] = i; cnt++; } sol[cnt] = n; } else if(n % 2 == 0 && k % 2 == 1) { int cnt = 0; for(int i = k; i <= n - 1; i += 2) { sol[cnt] = i; cnt++; } for(int i = 1; i <= k - 2; i += 2) { sol[cnt] = i; cnt++; } for(int i = k + 3; i <= n; i += 2) { sol[cnt] = i; cnt++; } for(int i = 2; i <= k + 1; i += 2) { sol[cnt] = i; cnt++; } } else { int cnt = 0; for(int i = k; i <= n - 2; i += 2) { sol[cnt] = i; cnt++; } for(int i = 1; i <= k - 2; i += 2) { sol[cnt] = i; cnt++; } for(int i = k + 3; i <= n - 1; i += 2) { sol[cnt] = i; cnt++; } for(int i = 2; i <= k + 1; i += 2) { sol[cnt] = i; cnt++; } sol[cnt] = n; } } print(sol, n); } return 0;}

转载地址:http://jxxli.baihongyu.com/

你可能感兴趣的文章
【Error】Kitematic - VirtualBox is not installed. Please install it via the Docker Toolbox.
查看>>
linux上硬盘重新挂载记录
查看>>
【pwnable.kr】 leg - ARM汇编 PC LR 寄存器 、THUMB汇编
查看>>
【pwnable.kr】 mistake - 运算符优先级
查看>>
wooyun 历史资源汇总
查看>>
【pwnable.kr】 shellshock
查看>>
【pwnable.kr】coin1 二分查找
查看>>
【pwnable.kr】 blackjack - 成为百万富翁(millionaire)
查看>>
【Kernel】漏洞利用技术 Heap Spray检测方法研究
查看>>
kotlin-android-extensions 插件无效问题
查看>>
经典排序算法--Java实现
查看>>
Java中JRadioButton单选按钮分组方法
查看>>
Java图形界面中单选按钮JRadioButton和按钮Button事件处理
查看>>
小练习 - 排序:冒泡、选择、快排
查看>>
操作系统原理:链接与ELF文件
查看>>
从汇编角度看C++类的方法访问类成员的原理
查看>>
操作系统原理:虚拟地址
查看>>
小练习 - 基于链表的栈和队列
查看>>
理论不扎实,编程不会有自己的想法
查看>>
数据库-子查询《mysql子查询的弱点》
查看>>