怎么把八皇后问题用c语言做出来图形界面,下面是八皇后的运行程序

仲夏569986 2013-06-24 04:10:35
#include<stdio.h>
#include<math.h>
#define max 8
int sum=0;
int board[max];
void show_result()
{
int i;
sum=sum+1;
printf("第%d种:",sum);
for(i=0;i<max;i++)
{
printf("(%d,%d) ",i,board[i]);
}
printf("\n");
}
int check_cross(int n)
{
int i;
for(i=0;i<n;i++)
{
if(board[i]==board[n]||(n-i)==abs(board[i]-board[n])) return 1;
}
return 0;
}
void put_chess(int n)
{
int i;
for(i=0;i<max;i++)
{
board[n]=i;
if(!check_cross(n))
{
if(n==max-1)
show_result();
else
put_chess(n+1);
}
}
}
void main()
{
put_chess(0);

return;
}
...全文
803 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Inhibitory 2013-06-29
  • 打赏
  • 举报
回复
处理都是一样的,给你一个Java版的可以参考


package com.tur.demo;

import javax.swing.*;
import java.awt.*;

public class EightQueen {
public static int num = 0;
private QueenShower queenShower = null;

public void Queen(int queenNum) {
// 因为每行只有一个皇后,所以用一维数组存储皇后状态,元素值为皇后在这一行的列值
int pos[] = new int[queenNum];
advance(0, queenNum, pos);
}

private void advance(int row, int queenNum, int pos[]) {
for (int col = 0; col < queenNum; col++) {
pos[row] = col;
if (isSafe(pos, row)) {
// 调用JPanel.repaint()显示
if (queenShower != null) queenShower.showQueen(pos, row);

if (row == queenNum - 1) {
num++;
printQueen(pos);//打印出当前的可行方案
} else {
advance(row + 1, queenNum, pos);
}
}
}
}

private boolean isSafe(int c[], int currentQueenNum) {
//当前是第几个皇后,当前和皇后依次和前面的皇后比较
//currentQueenNum表示当前是第几个皇后
for (int i = 0; i < currentQueenNum; i++) {
// 方阵中的对角线性质:(a, b) 的下面的对角是 (a + n, b + n)或者(a - n, b + n)
if (c[i] == c[currentQueenNum]
|| (c[i] - c[currentQueenNum]) == (i - currentQueenNum)
|| (c[i] - c[currentQueenNum]) == (currentQueenNum - i))
return false;
}
return true;
}

/**
* 打印棋盘
*/
private void printQueen(int[] status) {
int n = status.length;
StringBuilder queenString = new StringBuilder();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
queenString.append((j == status[i]) ? '*' : '-');
queenString.append((j == (n - 1)) ? "\n" : " ");
}
}

System.out.println("第" + num + "种解决方案:");
System.out.println(queenString);
}

public void setQueenShower(QueenShower queenShower) {
this.queenShower = queenShower;
}

public static void main(String[] args) {
QueenShower shower = new QueenShower();
shower.setDelay(10); // 设置动画暂停时间
shower.setDelayOfEnd(3000);

// 设置显示窗口
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.getContentPane().add(shower);
frame.setVisible(true);

// 创建EightQueen
EightQueen queen = new EightQueen();
queen.setQueenShower(shower);
int queenNumber = 8;//皇后数量
queen.Queen(queenNumber);
System.out.println("总共有" + num + "种解决方案,呵呵,效果还不错吧O(∩_∩)O");
}
}

/**
* 用来显示皇后状态的Panel
*/
class QueenShower extends JPanel {
private int currentRow = 0; // 当前是第几行
private int[] status = null; // 皇后状态数组
private int delay = 100; // 动画暂停时间
private int delayOfEnd = 5000; // 找到解决方暂停的时间,停久点可以方便看到解决方案

public QueenShower() {
}

public int getDelay() {
return delay;
}

public void setDelay(int delay) {
this.delay = delay;
}

public int getDelayOfEnd() {
return delayOfEnd;
}

public void setDelayOfEnd(int delayOfEnd) {
this.delayOfEnd = delayOfEnd;
}

public void showQueen(int[] status, int currentRow) {
this.status = status;
this.currentRow = currentRow;
this.repaint();

try {
// 找到解决方案的时候,多停一会
Thread.sleep((currentRow == status.length - 1) ? delayOfEnd : delay);
} catch (InterruptedException e) {
}
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // 使用Swing自带的双缓冲清除上一帧的痕迹

if (status == null) { return; }

int x = 0, y = 0;
int offsetX = 2, offsetY = 2; // gaps between the frame
Dimension size = getSize();
int cellWidth = (size.width - offsetX - offsetX) / status.length;
int cellHeight = (size.height - offsetY - offsetY) / status.length;

// Draw row grid lines
int width = status.length * cellWidth;
for (int i = 0; i <= status.length; ++i) {
g.drawLine(0 + offsetX, y + offsetY, width + offsetX, y + offsetY);
y += cellHeight;
}

// Draw column grid lines
int height = status.length * cellHeight;
for (int i = 0; i <= status.length; ++i) {
g.drawLine(x + offsetX, offsetY, x + offsetX, height + offsetY);
x += cellWidth;
}

// Draw queens
for (int i = 0; i <= currentRow; ++i) {
x = status[i] * cellWidth;
y = i * cellHeight;

g.fillRect(x + offsetX, y + offsetY, cellWidth, cellHeight);
}
}
}
super_admi 2013-06-28
  • 打赏
  • 举报
回复
无非是弄个棋盘图片和棋子图片,定义一个坐标,然后根据你计算的数据,把棋子图片摆上去。
仲夏569986 2013-06-28
  • 打赏
  • 举报
回复
楼上的可不可以给点相信点的信息,跪谢
水平不流 2013-06-24
  • 打赏
  • 举报
回复
windows下借助 MFC 库, linux下 可以用 gtk+/gnome 。
图灵狗 2013-06-24
  • 打赏
  • 举报
回复
借助EasyX(http://www.easyx.cn)库。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧