该程序是用NCURSES库实现的皇后问题,可以将算法结果以图形方式显示,并可遍历所有结果

编译时需要加上NCURSES链接库, gcc -o <> -lncurses

源代码如下,可在linux系统中编译后直接运行

#include <stdio.h>
#include <curses.h>

#define QUEEN_CHAR '*'

int *nqueens(int num);
int place(int current, int *position);
int print(int *positions, int num_queens);
void board(WINDOW *win, int starty, int startx, int lines, int cols, 
  int tile_width, int tile_height);

int main(int argc, char *argv[])
{
int num_queens, *positions, count;

if(argc != 2)
{ printf("Usage: %s <number of queens (chess board order)>\n", argv[0]);
exit(1);
}

num_queens = atoi(argv[1]);
initscr();
cbreak();
keypad(stdscr, TRUE);
positions = nqueens(num_queens);
free(positions);
endwin();
return 0;
}

int *nqueens(int num)
{
int current, *position, num_solutions = 0;

position = (int *) calloc(num + 1, sizeof(int));

position[1] = 0; 
current = 1; /* current queen is being checked */
/* position[current] is the coloumn*/
while(current > 0){
position[current] += 1;
while(position[current] <= num && !place(current, position) )
position[current] += 1;
if(position[current] <= num){
if(current == num) {
++num_solutions;
print(position, num);
}
else {
current += 1;
position[current] = 0;
}
}
else current -= 1; /* backtrack */
}
printf("Total Number of Solutions : %d\n", num_solutions);
return(position);
}

int place(int current, int *position)
{
int i;
if(current == 1) return(1);
for(i = 1; i < current; ++i)
if(position[i] == position[current]) return(0);
else if(abs(position[i] - position[current]) ==
abs(i - current))
return(0);

return(1);
}

int print(int *positions, int num_queens)
{ int count;
int y = 2, x = 2, w = 4, h = 2;
static int solution = 1;

mvprintw(0, 0, "Solution No: %d", solution++);
board(stdscr, y, x, num_queens, num_queens, w, h);
for(count = 1; count <= num_queens; ++count)
{ int tempy = y + (count - 1) * h + h / 2;
int tempx = x + (positions[count] - 1) * w + w / 2;
mvaddch(tempy, tempx, QUEEN_CHAR);
}
refresh();
mvprintw(LINES - 2, 0, "Press Any Key to See next solution (F1 to Exit)");
if(getch() == KEY_F(1))
{ endwin();
exit(0);
}
clear();
}

void board(WINDOW *win, int starty, int startx, int lines, int cols, 
  int tile_width, int tile_height)
{ int endy, endx, i, j;

endy = starty + lines * tile_height;
endx = startx + cols  * tile_width;

for(j = starty; j <= endy; j += tile_height)
for(i = startx; i <= endx; ++i)
mvwaddch(win, j, i, ACS_HLINE);
for(i = startx; i <= endx; i += tile_width)
for(j = starty; j <= endy; ++j)
mvwaddch(win, j, i, ACS_VLINE);
mvwaddch(win, starty, startx, ACS_ULCORNER);
mvwaddch(win, endy, startx, ACS_LLCORNER);
mvwaddch(win, starty, endx, ACS_URCORNER);
mvwaddch(win, endy, endx, ACS_LRCORNER);
for(j = starty + tile_height; j <= endy - tile_height; j += tile_height)
{ mvwaddch(win, j, startx, ACS_LTEE);
mvwaddch(win, j, endx, ACS_RTEE);
for(i = startx + tile_width; i <= endx - tile_width; i += tile_width)
mvwaddch(win, j, i, ACS_PLUS);
}
for(i = startx + tile_width; i <= endx - tile_width; i += tile_width)
{ mvwaddch(win, starty, i, ACS_TTEE);
mvwaddch(win, endy, i, ACS_BTEE);
}
wrefresh(win);
}

NCURSES程序设计之皇后问题相关推荐

  1. 88皇后问题C语言程序设计,八皇后问题--C语言程序设计.pdf

    八皇后问题 学 2012年 9 月 5 日 目录 一.选题 1.1背景知识---------------------------2 1.2设计目的与要求------------------------ ...

  2. 程序设计与算法----递归之n皇后问题

    问题描述 例题:n皇后 n皇后问题:输入整数n,要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击(即n个皇后可以横着吃,斜着吃,竖着吃.),输出全部方案. 输入一个正整数N,则程序输出N皇后问 ...

  3. 北京信息科技大学第十一届程序设计竞赛(重现赛)F kotori和n皇后

    链接:https://ac.nowcoder.com/acm/contest/940/F 来源:牛客网 题目描述 kotori最近在研究n皇后的问题. 所谓n皇后问题是这样的:一个n*n的地图,上面一 ...

  4. 八皇后java_经典八皇后问题:Java语言

    问题描述:将八个皇后放在棋盘上,任何两个皇后都不能互相攻击(即没有任何两个皇后在同一行.同一列或者同一对角线上)如图所示,题目来自于<java语言程序设计:基础篇>练习题6.20和6.22 ...

  5. python深度优先算法 八皇后_八皇后问题——DFS(深度优先搜索)

    八皇后问题,是在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法? 算法思路: 八皇后问题实质为一种深度优先(DFS)搜索问题. ...

  6. c语言程序设计编程解读,C语言程序设计第三次实验报告解读

    <C语言程序设计第三次实验报告解读>由会员分享,可在线阅读,更多相关<C语言程序设计第三次实验报告解读(15页珍藏版)>请在人人文库网上搜索. 1.C语言程序设计实验报告专业 ...

  7. 数据结构之栈与递归的应用(八皇后递归解法)

    前面几节讲述了递归的一般应用,本节讲一下递归的另一个重要的应用场合回溯算法,利用函数调用的活动对象可以保存回溯算法中重要的变量信息 . 递归与回溯 递归在程序设计中也常用于需要回溯算法的场合. 回溯算 ...

  8. C语言程序项目计划书,(C语言程序设计课程设计计划书.doc

    (C语言程序设计课程设计计划书 C语言程序设计课程设计计划书 一.目的 1.熟悉并掌握C语言程序设计的基本方法与技能. 2.掌握利用递归进行程序设计的方法. 3.掌握对随机事件进行全程模拟的基本方法. ...

  9. 桂林理工大学 程序设计实践课程 实习报告

    学  号: 320205205# 桂林理工大学 GUILIN UNIVERSITY OF TECHNOLOGY    程序设计实践课程      实习报告 学      院: 信息科学与工程学院 # ...

  10. 函数式程序设计为什么至关重要(转载)

    Why Functional Programming Matters 函数式程序设计为什么至关重要 作者: John Hughes 翻译: CloudiDust [http://blog.csdn.n ...

最新文章

  1. 7000p壁纸怎么换_这些圣诞壁纸,劝你们马上点开,保存!真的超好看
  2. WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference!
  3. 『数据库』数据库编程(概念性的东西,应用一般,甚至有点过时,用来考试)
  4. Netty 4.x – ByteBuf
  5. SCCM2007 R2的部署前准备,SCCM系列之一
  6. python redis 性能测试台_Redis性能测试
  7. xy坐标正负方向_【笛卡尔坐标系】
  8. 服务器每天产生1t文件,编写自己的服务器 - osc_popfjd1t的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. leetcode 高薪_利用两种不同的方法解LeetCode第1312题:让字符串成为回文串的最少插入次数
  10. Vue2.0 + ElementUI 手写权限管理系统后台模板(三)——页面搭建
  11. vue中用echarts写条形图
  12. 计算机导入文件格式,电脑如何打开zip格式文件|电脑打开zip格式文件的方法
  13. Ubuntu 双系统安装流程
  14. 用户画像理解和方法论
  15. ISA服务器安装设置全集
  16. 高德地图定位坐标偏差android,【报Bug】app端高德地图定位不准确
  17. 51单片机键盘、矩阵键盘松手检测
  18. QT OpenGL(一 VAO、VBO、EBO使用)
  19. 呼叫中心管理之:让座席看见自己
  20. 车载平板android 002,用平板代替车载大屏,行得通吗?

热门文章

  1. usb万能驱动win7_联想笔记本/联想一体机/台式机改win7步骤
  2. 如何录用有竞业限制协议的员工?
  3. JAVA_OPTS设置详解
  4. Linux加密框架中的算法和算法模式(二)
  5. java 65533,java导出excel超出65533行
  6. 计算机cpu后面字母代表什么意思,英特尔CPU型号中最后的字母什么意思?如有不懂欢迎驻足停留...
  7. 关于 IP 属地的一些科普
  8. 思科模拟器路由表怎么看_Cisco路由配置教程 Cisco路由器静态路由与默认路由的配置方法图解...
  9. 无线网卡 VS 无线上网卡
  10. 微前端single-spa vue3 实战落地