• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
gw2010
重新编程
博客园    首页    新随笔    联系   管理    订阅  订阅
八皇后 算法

看到有写这个的,所以自己写来练习一下,不过只是写到出结果,没有把所有的结果打印出来.

刚写的时候有些困难,后面步步细分,还是很好实现,主要是体现要分解来解决问题,下面是一坨C#的代码

    /// <summary>
    /// 八皇后问题解法
    /// 在网上看到有人写八皇后问题,今天写一个锻炼,保持对算法的感觉
    /// 2014-03-04
    /// 思想 动态规划,多分步骤
    /// </summary>
    public class EightQueen
    {
        private int QUEENNUM = 8;
        private int ROW = 8;
        private int COL = 8;
        private int[,] map;
        public EightQueen()
        {
            map = new int[ROW, COL];
            position = new List<Tuple<int, int>>[QUEENNUM];
            for (int i = 0; i < QUEENNUM; i++)
            {
                position[i] = new List<Tuple<int, int>>();
            }
        }
        #region 核心代码
        private List<Tuple<int, int>>[] position;
        //开始
        public void Start()
        {
            for (int i = 0; i < QUEENNUM; i++)
            {
                bool re = SetQueen(i);
                if (!re)
                {
                    ClearMap(i - 1);//清除地图
                    ClearPosition(i);//清除位置
                    i = i - 2;
                }
            }
        }
        //放下第num个皇后,true 正确放下 false 放不下
        private bool SetQueen(int num)
        {
            //棋盘上试
            for (int row = 0; row < ROW; row++)
            {
                for (int col = 0; col < COL; col++)
                {
                    if (IsSet(num, row, col))
                    {
                        map[row, col] = (num + 1);
                        LogPosition(num, row, col);
                        return true;
                    }
                }
            }
            return false;
        }
        //记录当前后已经试过的位置
        private void LogPosition(int num, int row, int col)
        {
            position[num].Add(new Tuple<int, int>(row, col));
        }
        //清空当前后位置信息
        private void ClearPosition(int num)
        {
            position[num].Clear();
        }
        //清除地图上的
        private void ClearMap(int num)
        {
            foreach (var a in position[num])
            {
                map[a.Item1, a.Item2] = 0;
            }
        }
        //当前位置是否可以放置后
        private bool IsSet(int num, int row, int col)
        {
            //试过的位置不能放
            foreach (var a in position[num])
            {
                if (a.Item1 == row && a.Item2 == col)
                    return false;
            }
            //没有放后的位置或被吃的位置可以放
            return map[row, col] == 0 && !InLine(row, col);
        }
        // true 线上有后了
        private bool InLine(int row, int col)
        {
            for (int i = 0; i < 8; i++)
            {
                //列
                if (map[i, col] > 0)
                    return true;
                //行
                if (map[row, i] > 0)
                    return true;
                //斜
                //+ +
                if (row + i < 8 && col + i < 8 && map[row + i, col + i] > 0)
                    return true;
                //+ -
                if (row + i < 8 && col - i >= 0 && map[row + i, col - i] > 0)
                    return true;
                //- +
                if (row - i >= 0 && col + i < 8 && map[row - i, col + i] > 0)
                    return true;
                //- -
                if (row - i >= 0 && col - i >= 0 && map[row - i, col - i] > 0)
                    return true;
            }
            return false;
        }
        #endregion
        // 显示棋盘数据
        public void Show()
        {
            for (int i = 0; i < ROW; i++)
            {
                for (int j = 0; j < COL; j++)
                {
                    Console.Write("{0} ", map[i, j]);
                }
                Console.WriteLine();
            }
        }
    }

总结

在思考复杂问题的时候尽量可以分细来处理,先把框架写出来,再写里面内容.像上面代码里的有几个方法,基本上就是一行代码为什么我还是分成了一个方法,为什么不在调用处用这一行代码呢?

这个就是之前思考留下的退迹,当然这样也会更好理解,因为我看到方法名我就知道这是一个什么步聚,但是一行代码不一定能读清楚.

声明本博客文章未特殊注明均为原创,转载请注明作者和原地址。 博客地址:http://www.cnblogs.com/gw2010/ 博客首发:http://www.zhou2019.cn
posted on 2014-03-06 13:34  gw2010  阅读(318)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3