A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1774055019 中级黑马   /  2015-11-7 22:08  /  691 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

经典的八皇后难题是要将八个皇后放在8*8的棋盘上,任何两个皇后都不能互相攻击(即没有两个皇后是在同一行丶同一列或同一对角线上)
有谁知道八皇后问题的详细解决办法吗?在网上搜的答案好难看懂啊

评分

参与人数 1黑马币 +8 收起 理由
大师兄与二师兄 + 8 很给力!

查看全部评分

5 个回复

倒序浏览
bool IsSafe(int col,int row,int[] queenList) {                      //只检查前面的列             for (int tempCol = 0; tempCol < col; tempCol++) {                 int tempRow = queenList[tempCol];                 if (tempRow == row) {                     //同一行                     return false;                  }                 if (tempCol == col) {                     //同一列                     return false;                 }                 if (tempRow - tempCol == row - col || tempRow + tempCol == row + col) {                     return false;                 }             }             return true;         } 设定一个方法,用于查找col列后的皇后摆放方法:                  // <summary>         // 在第col列寻找安全的row值         // </summary>         //<param name="queenList"></param>         // <param name="col"></param>         // <returns></returns>         public bool PlaceQueue(int[] queenList, int col) {             int row = 0;             bool foundSafePos = false;             if (col == 8) {//结束标志                 //当处理完第8列的完成                 foundSafePos = true;             }             else {                 while (row < 8 && !foundSafePos) {                     if (IsSafe(col, row, queenList)) {                         //找到安全位置                         queenList[col] = row;                         //找下一列的安全位置                         foundSafePos = PlaceQueue(queenList, col + 1);                         if (!foundSafePos) {                             row++;                         }                     }                     else {                         row++;                     }                 }             }             return foundSafePos;         } //调用方法:   static void Main(string[] args) {             EightQueen eq = new EightQueen();             int[] queenList = new int[8];             for (int j = 0; j < 8; j++) {                 Console.WriteLine("-----------------"+j+"---------------------");                 queenList[0] = j;                 bool res = eq.PlaceQueue(queenList, 1);                  if (res) {                     Console.Write("   ");                            for (int i = 0; i < 8; i++) {                         Console.Write(" " + i.ToString() + " ");                            }                     Console.WriteLine("");                     for (int i = 0; i < 8; i++) {                         Console.Write(" "+i.ToString()+" ");                                                for (int a = 0; a < 8; a++) {                                                if (i == queenList[a]) {                                 Console.Write(" q ");                             }                             else {                                 Console.Write(" * ");                             }                         }                         Console.WriteLine("");                                                      }                                        Console.WriteLine("---------------------------------------");                 }                 else {                     Console.WriteLine("不能完成棋局,棋局失败!");                 }             }             Console.Read();         }
回复 使用道具 举报
活到老,学到老 发表于 2015-11-7 22:28
bool IsSafe(int col,int row,int[] queenList) {                      //只检查前面的列             for ...

这就是网上查的答案啊
回复 使用道具 举报
1774055019 发表于 2015-11-7 22:42
这就是网上查的答案啊

我刚刚好好看了一下,好多错误,类型错误,大小写错误,方法错误,一大堆的。修改他的还没有我自己写一个快呢
回复 使用道具 举报
问题本来就难
回复 使用道具 举报

。。。这问题很难吗?我以为只是我笨呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马