日期:2014-05-19  浏览次数:21231 次

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
------解决方案--------------------
应该会比较复杂,如果提单个子会比较简单,但子与子之间会有连接,要一直推算下去,才能提成片的子。