C# 回溯法实现八皇后
2010-04-24 00:03
253 查看
都是自己写的,大家看看,轻点口水,有啥意见指出来,主要用的回溯法
![](images/editer/InBlock.gif)
public class MyData
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
public int X{set;get;}
![](images/editer/InBlock.gif)
public int Y { set; get; }
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
public MyData()
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
this.X = 0;
![](images/editer/InBlock.gif)
this.Y = 0;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
public MyData(int i,int j )
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
this.X = i;
![](images/editer/InBlock.gif)
this.Y = j;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
private int Queen( int size)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
int Count = 0;
![](images/editer/InBlock.gif)
Stack<MyData> myDataStack = new Stack<MyData>();//用于存储结果
![](images/editer/InBlock.gif)
MyData[,] data = new MyData[size, size]; //棋盘
![](images/editer/InBlock.gif)
for (int i = 0; i < size; i++)//棋盘初始化
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
for (int j = 0; j < size; j++)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
data[i, j] = new MyData();
![](images/editer/InBlock.gif)
data[i, j].X = i;
![](images/editer/InBlock.gif)
data[i, j].Y = j;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
int Row = 0,Column = 0;//行,列
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
myDataStack.Push(new MyData(Row, Column));//第一行
![](images/editer/InBlock.gif)
Row++;
![](images/editer/InBlock.gif)
while (Row < size)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
while (Column < size)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
if (Test(myDataStack, data[Row, Column]))
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
myDataStack.Push(new MyData(Row, Column)); //当一行查找到满足条件的时候,Column从0开始
![](images/editer/InBlock.gif)
Row++;
![](images/editer/InBlock.gif)
Column = 0;
![](images/editer/InBlock.gif)
break;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
else
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
Column++;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
if (Column == size && myDataStack.Count!=size)//当当前行没有任何数据满足时,回溯
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
Row--;
![](images/editer/InBlock.gif)
if (myDataStack.Count-1 > 0)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
if (myDataStack.Peek().Y + 1 < size)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
Column = myDataStack.Peek().Y + 1;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
else
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
while (myDataStack.Peek().Y + 1 == size) //当回溯到新的一行为行中最后一列时,继续回溯
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
if (myDataStack.Count - 1 > 0)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
Row--;
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
Column = myDataStack.Peek().Y + 1;
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
else //如果回溯到第一行时
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
Column = myDataStack.Peek().Y + 1;
![](images/editer/InBlock.gif)
if (Column == 8) //当列为8时结束全部循环
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
break;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
else
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
myDataStack.Push(new MyData(Row, Column));
![](images/editer/InBlock.gif)
Row++;
![](images/editer/InBlock.gif)
Column = 0;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
continue;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
if (myDataStack.Count == size)//当一种查找结果完成时输出
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
Count++;
![](images/editer/InBlock.gif)
output(myDataStack,Count);
![](images/editer/InBlock.gif)
Row--; //回溯其他情况
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
while (myDataStack.Peek().Y + 1 == size)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
if (myDataStack.Count - 1 > 0)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
Row--;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
Column = myDataStack.Peek().Y + 1;
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
Row--;
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
continue;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
return Count;
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
public void output (Stack<MyData> data,int count)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
textBox1.Text += count + ":";
![](images/editer/InBlock.gif)
foreach (MyData mydata in data)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
textBox1.Text += "(" + mydata.X + "," + mydata.Y + ") ";
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
textBox1.Text += "\r\n";
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
public bool Test(Stack<MyData> data, MyData myData)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
foreach (MyData mydata in data)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
// 测试是否在同一排
![](images/editer/InBlock.gif)
if (mydata.X == myData.X)
![](images/editer/InBlock.gif)
return false;
![](images/editer/InBlock.gif)
// 测试是否在一斜线
![](images/editer/InBlock.gif)
if (mydata.Y == myData.Y)
![](images/editer/InBlock.gif)
return false;
![](images/editer/InBlock.gif)
// 测试是否在一反斜线
![](images/editer/InBlock.gif)
if (System.Math.Abs(myData.X-mydata.X)==System.Math.Abs(myData.Y-mydata.Y))
![](images/editer/InBlock.gif)
return false;
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
return true;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
附件:http://down.51cto.com/data/2355636
![](images/editer/InBlock.gif)
public class MyData
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
public int X{set;get;}
![](images/editer/InBlock.gif)
public int Y { set; get; }
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
public MyData()
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
this.X = 0;
![](images/editer/InBlock.gif)
this.Y = 0;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
public MyData(int i,int j )
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
this.X = i;
![](images/editer/InBlock.gif)
this.Y = j;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
private int Queen( int size)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
int Count = 0;
![](images/editer/InBlock.gif)
Stack<MyData> myDataStack = new Stack<MyData>();//用于存储结果
![](images/editer/InBlock.gif)
MyData[,] data = new MyData[size, size]; //棋盘
![](images/editer/InBlock.gif)
for (int i = 0; i < size; i++)//棋盘初始化
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
for (int j = 0; j < size; j++)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
data[i, j] = new MyData();
![](images/editer/InBlock.gif)
data[i, j].X = i;
![](images/editer/InBlock.gif)
data[i, j].Y = j;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
int Row = 0,Column = 0;//行,列
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
myDataStack.Push(new MyData(Row, Column));//第一行
![](images/editer/InBlock.gif)
Row++;
![](images/editer/InBlock.gif)
while (Row < size)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
while (Column < size)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
if (Test(myDataStack, data[Row, Column]))
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
myDataStack.Push(new MyData(Row, Column)); //当一行查找到满足条件的时候,Column从0开始
![](images/editer/InBlock.gif)
Row++;
![](images/editer/InBlock.gif)
Column = 0;
![](images/editer/InBlock.gif)
break;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
else
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
Column++;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
if (Column == size && myDataStack.Count!=size)//当当前行没有任何数据满足时,回溯
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
Row--;
![](images/editer/InBlock.gif)
if (myDataStack.Count-1 > 0)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
if (myDataStack.Peek().Y + 1 < size)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
Column = myDataStack.Peek().Y + 1;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
else
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
while (myDataStack.Peek().Y + 1 == size) //当回溯到新的一行为行中最后一列时,继续回溯
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
if (myDataStack.Count - 1 > 0)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
Row--;
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
Column = myDataStack.Peek().Y + 1;
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
else //如果回溯到第一行时
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
Column = myDataStack.Peek().Y + 1;
![](images/editer/InBlock.gif)
if (Column == 8) //当列为8时结束全部循环
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
break;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
else
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
myDataStack.Push(new MyData(Row, Column));
![](images/editer/InBlock.gif)
Row++;
![](images/editer/InBlock.gif)
Column = 0;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
continue;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
if (myDataStack.Count == size)//当一种查找结果完成时输出
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
Count++;
![](images/editer/InBlock.gif)
output(myDataStack,Count);
![](images/editer/InBlock.gif)
Row--; //回溯其他情况
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
while (myDataStack.Peek().Y + 1 == size)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
if (myDataStack.Count - 1 > 0)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
Row--;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
Column = myDataStack.Peek().Y + 1;
![](images/editer/InBlock.gif)
myDataStack.Pop();
![](images/editer/InBlock.gif)
Row--;
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
continue;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
return Count;
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
public void output (Stack<MyData> data,int count)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
textBox1.Text += count + ":";
![](images/editer/InBlock.gif)
foreach (MyData mydata in data)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
textBox1.Text += "(" + mydata.X + "," + mydata.Y + ") ";
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
textBox1.Text += "\r\n";
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
public bool Test(Stack<MyData> data, MyData myData)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
foreach (MyData mydata in data)
![](images/editer/InBlock.gif)
{
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
// 测试是否在同一排
![](images/editer/InBlock.gif)
if (mydata.X == myData.X)
![](images/editer/InBlock.gif)
return false;
![](images/editer/InBlock.gif)
// 测试是否在一斜线
![](images/editer/InBlock.gif)
if (mydata.Y == myData.Y)
![](images/editer/InBlock.gif)
return false;
![](images/editer/InBlock.gif)
// 测试是否在一反斜线
![](images/editer/InBlock.gif)
if (System.Math.Abs(myData.X-mydata.X)==System.Math.Abs(myData.Y-mydata.Y))
![](images/editer/InBlock.gif)
return false;
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
return true;
![](images/editer/InBlock.gif)
}
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
![](images/editer/InBlock.gif)
}
附件:http://down.51cto.com/data/2355636
相关文章推荐
- 回溯法实现八皇后问题
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
- 八皇后算法的另一种实现(c#版本)
- 八皇后的算法实现(回溯法)
- C#WPF实现回溯算法解决八皇后问题
- 八皇后(二维数组回溯法实现)
- 回溯法实现八皇后问题
- C#实现获取设置IP地址小工具
- C#简易线性表实现。
- C#基础系列:开发自己的窗体设计器(实现控件的拖动)
- c# list排序的实现方式
- C#开发 WinForm如何在选项卡中集成加载多个窗体 实现窗体复用(图文)
- 用haskell实现的八皇后程序
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- 基于C#的BarCode 39实现
- C# Linq 实现 对表某类型的数据统计
- (C#)DataGrid实现自定义分页,鼠标移至变色,删除确认、可编辑,可删除
- C#实现图标批量下载
- C#实现AES加密和解密
- 用C#实现在Word文档中搜索文本