一个有关皇后问题的程序(C#)
2007-11-14 15:09
381 查看
using System;
namespace sunjoy
{
public class Queen
{
public static int Main()
{
int board_size = 0,x=0,y=0;//棋盘大小,当前行,当前列
uint solution_count = 0; //皇后摆放方案的个数
int[] rows, cols, slot1, slot2, x2y;//行占用情况,列占用情况,“/”状斜线占用情况,“/”状斜线占用情况,皇后坐标
DateTime t_start, t_end;
Console.WriteLine("请输入棋盘的大小");
try
{
board_size = Convert.ToInt32(Console.ReadLine());
if (board_size <= 0)
{
Console.WriteLine("非法数据");
return -1;
}
}
catch (Exception e) { Console.WriteLine("发生异常" + e.Message); };
rows = new int[board_size];
cols = new int[board_size];
slot1 = new int[board_size * 2 - 1];
slot2 = new int[board_size * 2 - 1];
x2y = new int[board_size];
for (int i = 0; i < board_size; i++)
x2y[i] = -1; //坐标初始化都为-1
t_start = DateTime.Now;
while (true)
{
for (y = x2y[x]+1; y < board_size; y++)
if (rows[x] == 0 && cols[y] == 0 && slot1[x + y] == 0 && slot2[x - y + board_size - 1] == 0)
break;
if (y < board_size)
{
//第X行的棋子落下
rows[x] = 1; cols[y] = 1; slot1[x + y] = 1; slot2[x - y + board_size - 1] = 1; x2y[x] = y;
}
else
{
//回溯,拿起棋子
if (x > 0)
{
x2y[x] = -1;
x--;
rows[x] = 0; cols[x2y[x]] = 0; slot1[x + x2y[x]] = 0; slot2[x - x2y[x] + board_size - 1] = 0;
continue;
}
else break;
}
if (x == board_size - 1) //如果已经得到了一组解,即当最后一行棋子落定之时
{
for (int i = 0; i < board_size; i++)
{
for (int j = 0; j < board_size; j++)
{
if (x2y[i] == j) Console.Write("Q");
else Console.Write("■");
}
Console.Write("/n");
}
Console.Write("/n");
solution_count++; //总方案数加一
rows[x] = 0; cols[x2y[x]] = 0; slot1[x + x2y[x]] = 0; slot2[x - x2y[x] + board_size - 1] = 0;//放弃这一列
}
else
{
x++; //继续处理下一行
}
}
t_end = DateTime.Now;
Console.WriteLine("总共{0}组解",solution_count);
Console.WriteLine("计算及打印共用时间{0}秒",t_end-t_start);
Console.ReadLine();
return 0;
}
}
}
namespace sunjoy
{
public class Queen
{
public static int Main()
{
int board_size = 0,x=0,y=0;//棋盘大小,当前行,当前列
uint solution_count = 0; //皇后摆放方案的个数
int[] rows, cols, slot1, slot2, x2y;//行占用情况,列占用情况,“/”状斜线占用情况,“/”状斜线占用情况,皇后坐标
DateTime t_start, t_end;
Console.WriteLine("请输入棋盘的大小");
try
{
board_size = Convert.ToInt32(Console.ReadLine());
if (board_size <= 0)
{
Console.WriteLine("非法数据");
return -1;
}
}
catch (Exception e) { Console.WriteLine("发生异常" + e.Message); };
rows = new int[board_size];
cols = new int[board_size];
slot1 = new int[board_size * 2 - 1];
slot2 = new int[board_size * 2 - 1];
x2y = new int[board_size];
for (int i = 0; i < board_size; i++)
x2y[i] = -1; //坐标初始化都为-1
t_start = DateTime.Now;
while (true)
{
for (y = x2y[x]+1; y < board_size; y++)
if (rows[x] == 0 && cols[y] == 0 && slot1[x + y] == 0 && slot2[x - y + board_size - 1] == 0)
break;
if (y < board_size)
{
//第X行的棋子落下
rows[x] = 1; cols[y] = 1; slot1[x + y] = 1; slot2[x - y + board_size - 1] = 1; x2y[x] = y;
}
else
{
//回溯,拿起棋子
if (x > 0)
{
x2y[x] = -1;
x--;
rows[x] = 0; cols[x2y[x]] = 0; slot1[x + x2y[x]] = 0; slot2[x - x2y[x] + board_size - 1] = 0;
continue;
}
else break;
}
if (x == board_size - 1) //如果已经得到了一组解,即当最后一行棋子落定之时
{
for (int i = 0; i < board_size; i++)
{
for (int j = 0; j < board_size; j++)
{
if (x2y[i] == j) Console.Write("Q");
else Console.Write("■");
}
Console.Write("/n");
}
Console.Write("/n");
solution_count++; //总方案数加一
rows[x] = 0; cols[x2y[x]] = 0; slot1[x + x2y[x]] = 0; slot2[x - x2y[x] + board_size - 1] = 0;//放弃这一列
}
else
{
x++; //继续处理下一行
}
}
t_end = DateTime.Now;
Console.WriteLine("总共{0}组解",solution_count);
Console.WriteLine("计算及打印共用时间{0}秒",t_end-t_start);
Console.ReadLine();
return 0;
}
}
}
相关文章推荐
- C#中出现了一个问题,就是程序主窗体已经打开,在调用子窗体时候出现了创建窗口句柄时出错。
- N皇后问题的一个程序,请大家看看!帮忙修改
- 解决C# WinForm 中 VSHOST.EXE 程序不关闭的有关问题
- c#调用API(GetModuleFileName)获取程序路径返回乱码有关问题
- C#.NET常见问题(FAQ)-程序如何把窗体文件从从一个项目中复制到另一个项目
- C#写一般处理程序遇到的一个String和int转换的问题
- C#程序转为VB.NET程序的一个小问题
- 一个C#中调用命令行程序的问题
- 一个跟操作系统linux和windows差异有关的问题:通过soap的无wsdl实现php程序通信的程序(经典的吐血)
- C# 在一个窗体中调用另一个窗体的控件可能出现的问题
- 编写一个程序解决选择问题
- 用Java和C#编写一个截屏小程序
- 运行一个简单的C#程序
- 以前写的一个手机通讯录管理小程序回忆一下(C#版大牛绕过)致曾经写过的小程序
- C# Winform程序经验之Form问题总结
- 有关JVM常量池和String.intern() 的一个有趣的问题
- 一个C#随机数的问题,解决随机数重复
- 对求解“皇后排列问题”的一个新解法!
- 由一个程序异常终止问题学到的
- 遇到一个问题,一个程序是否能只进行一次软件重启?