首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

100分求围棋的提子算法,该如何解决

2012-01-21 
100分求围棋的提子算法如题[解决办法]不会帮顶[解决办法]顶[解决办法]帮顶![解决办法]我有个C++的[解决办

100分求围棋的提子算法
如题

[解决办法]
不会 帮顶
[解决办法]

[解决办法]
帮顶!
[解决办法]
我有个C++的
[解决办法]
深度优先搜索


[解决办法]
C++
的思想就完全满足楼主的了
[解决办法]
玩都不会玩 更别说写代码了
[解决办法]
我想没个子都有四气及上下左右,相通为有气,否则为没气
下棋双方没下一个棋子,都算下相关棋子的气。
若一个棋子的四气都没有了,就提子。

不知道我这么简单的说法,楼主是否明白或有什么启发。
若想具体的或进一步探讨。请留言。
[解决办法]
已经发出了
[解决办法]
不会玩,象棋的还行
[解决办法]
private int[,] Points = new int[19, 19]; // 棋子点阵 // +1:黑子 -1:白子 0:空地

/// <summary>
/// 判断落子点是否被包围
/// </summary>
/// <param name= "AChessman "> 落子颜色 +1/-1 </param>
/// <param name= "APoint "> 落子位置 </param>
/// <returns> 返回落子点是否被包围 </returns>
private bool Besiege(int AChessman, Point APoint)
{
if (APoint.X < 0 || APoint.Y < 0 || APoint.X > = 19 || APoint.Y > = 19)
return false; // 落子位置超出边界
bool[,] besiegeList = new bool[19, 19];
return fBesiege(AChessman, APoint, ref besiegeList);
}

private bool fBesiege(int AChessman, Point APoint, ref bool[,] ABesiegeList)
{
if (ABesiegeList[APoint.X, APoint.Y]) return true; // 已经计算过
ABesiegeList[APoint.X, APoint.Y] = true; // 标记已经计算
Point[] vPoints = new Point[] { // 四周的位置坐标
new Point(APoint.X + 1, APoint.Y),
new Point(APoint.X - 1, APoint.Y),
new Point(APoint.X, APoint.Y + 1),
new Point(APoint.X, APoint.Y - 1)};
foreach (Point vPoint in vPoints)
{
if (vPoint.X < 0 || vPoint.Y < 0 || vPoint.X > = 19 || vPoint.Y > = 19)
continue; // 检查范围
if (Points[vPoint.X, vPoint.Y] == 0) // 发现空地
return false;
if (AChessman == Points[vPoint.X, vPoint.Y] && // 同色棋子
!fBesiege(AChessman, vPoint, ref ABesiegeList)) // 扫描下一个点
return false;
}
return true;
}

大概是这样,判断以后再用同样的方法提子
[解决办法]
UP
[解决办法]
感觉不难
假设落下的是白棋

首先 找出落子点周围的黑棋
然后以这个黑棋为开始 找出所有连在一起的黑棋 只要一个有气 就不能提


如果没有气 则全部提取



[解决办法]
这个一定要学习
[解决办法]
frankla(frank)
的讲法是正确的
[解决办法]
up
[解决办法]
应该会比较复杂,如果提单个子会比较简单,但子与子之间会有连接,要一直推算下去,才能提成片的子。

[解决办法]
就是啊....要把连在一起的子都判断了...全是没气的才能提啊
[解决办法]
up
学习
[解决办法]
mark
[解决办法]
对围棋一窍不通 帮顶
[解决办法]
怎么没有高手帮我的忙啊~150分而

热点排行