您的位置:首页 > 编程语言 > C#

C# 回溯法实现八皇后

2010-04-24 00:03 253 查看
都是自己写的,大家看看,轻点口水,有啥意见指出来,主要用的回溯法

public class MyData


{


public int X{set;get;}


public int Y { set; get; }




public MyData()


{




this.X = 0;


this.Y = 0;


}



public MyData(int i,int j )


{




this.X = i;


this.Y = j;


}


}

private int Queen( int size)


{


int Count = 0;


Stack<MyData> myDataStack = new Stack<MyData>();//用于存储结果


MyData[,] data = new MyData[size, size]; //棋盘


for (int i = 0; i < size; i++)//棋盘初始化


{


for (int j = 0; j < size; j++)


{


data[i, j] = new MyData();


data[i, j].X = i;


data[i, j].Y = j;



}


}



int Row = 0,Column = 0;//行,列




myDataStack.Push(new MyData(Row, Column));//第一行


Row++;



while (Row < size)


{



while (Column < size)


{


if (Test(myDataStack, data[Row, Column]))


{


myDataStack.Push(new MyData(Row, Column)); //当一行查找到满足条件的时候,Column从0开始


Row++;


Column = 0;


break;


}


else


{


Column++;


}



}



if (Column == size && myDataStack.Count!=size)//当当前行没有任何数据满足时,回溯


{


Row--;



if (myDataStack.Count-1 > 0)


{


if (myDataStack.Peek().Y + 1 < size)


{


Column = myDataStack.Peek().Y + 1;


}


else


{


while (myDataStack.Peek().Y + 1 == size) //当回溯到新的一行为行中最后一列时,继续回溯


{


if (myDataStack.Count - 1 > 0)


{


Row--;


myDataStack.Pop();




}


}


Column = myDataStack.Peek().Y + 1;




}




myDataStack.Pop();




}


else //如果回溯到第一行时


{




Column = myDataStack.Peek().Y + 1;


if (Column == 8) //当列为8时结束全部循环


{


break;


}


else


{


myDataStack.Pop();



myDataStack.Push(new MyData(Row, Column));


Row++;


Column = 0;


}




}


continue;


}


if (myDataStack.Count == size)//当一种查找结果完成时输出


{


Count++;


output(myDataStack,Count);


Row--; //回溯其他情况


myDataStack.Pop();


while (myDataStack.Peek().Y + 1 == size)


{


if (myDataStack.Count - 1 > 0)


{


myDataStack.Pop();


Row--;


}


}


Column = myDataStack.Peek().Y + 1;


myDataStack.Pop();


Row--;




continue;



}


}


return Count;




}






public void output (Stack<MyData> data,int count)


{


textBox1.Text += count + ":";


foreach (MyData mydata in data)


{


textBox1.Text += "(" + mydata.X + "," + mydata.Y + ") ";


}


textBox1.Text += "\r\n";




}



public bool Test(Stack<MyData> data, MyData myData)


{




foreach (MyData mydata in data)


{




// 测试是否在同一排


if (mydata.X == myData.X)


return false;


// 测试是否在一斜线


if (mydata.Y == myData.Y)


return false;


// 测试是否在一反斜线


if (System.Math.Abs(myData.X-mydata.X)==System.Math.Abs(myData.Y-mydata.Y))


return false;




}


return true;


}







}

附件:http://down.51cto.com/data/2355636
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲 皇后 回溯