随笔 - 51  文章 - 0 评论 - 210 trackbacks - 6
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

严正声明 : 本站文章转载请注明出处.

与我联系

搜索

 

留言簿(11)

我的标签

随笔分类

随笔档案

Atlas相关

积分与排名

  • 积分 - 58802
  • 排名 - 800

阅读排行榜

这个算法还是比较简单. 看代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace N皇后问题
{
    
//问题描述: 在1个 N X N的棋盘上放N个皇后,要求不能互相攻击,问如何摆放.
    
//因为每个皇后不能在同一行,那么这个解的位置可以使用列的位置就可以表示了,因此使用一个8元素的数组来表示这个题的
    
//解法.
    
//再往下看,其实可以演变为求一个由指定字符组成的字串的全排列组合, 再验证每一种组合的可能性.
    class Program
    {
        
static void Main(string[] args)
        {
            
//int[] result = new int[8];
            DateTime start = DateTime.Now;
            
string cols = "01234567";//用以产生一个全排列. 稍加修改, 在这里还可以计算 9, 10皇后的结果

            
char[] arr_cols = cols.ToCharArray();
            
string[] result = get_all_position(null, arr_cols, arr_cols.Length);
            
//得到所有的可能的组合.
            
//每个皇后的坐标为, X: 数组元素的下标, Y: 当前值.

            
//现在需要一个验证方法.
            int result_count = 0;
            StringBuilder sb 
= new StringBuilder();
            
for (int kk = 0; kk < result.Length; kk++)
            {
                
if (validate(result[kk]))
                {
                    result_count
++;
                    sb.Append(result[kk]);
                    sb.Append(
" | ");
                }
            }

            DateTime end 
= DateTime.Now;

            TimeSpan span 
= (TimeSpan)(end  - start);
            Console.Write(sb.ToString());
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine(
"总解的个数为: " + result_count.ToString() + " 个");
            Console.WriteLine(
"耗费时间: " + span.TotalSeconds.ToString());
            Console.ReadLine();
        }
        
static string[] get_all_position(string[] all_position, char[] arr_char, int level)
        {
            
string[] base_position = null;

            
if (level == 0)
                
return new string[] { arr_char[0].ToString() };
            
else
                base_position 
= get_all_position(all_position, arr_char, level - 1);

            
if (level == arr_char.Length)
                
return base_position;

            
char new_char = arr_char[level];

            
int string_length = 0;
            
if (base_position.Length > 0)
                string_length 
= base_position[0].Length;

            
string[] new_position = new string[base_position.Length * (level + 1)];

            
for (int i = 0; i < base_position.Length; i++)
            {
                new_position[(string_length 
+ 1* i] = new_char + base_position[i];
                
for (int k = 0; k < string_length; k++)
                {
                    new_position[(string_length 
+ 1* i + k + 1= base_position[i][k] + base_position[i].Replace(base_position[i][k], new_char);
                }
            }

            
return new_position;
        }

        
static bool validate(string position)
        {
            
char[] arr = position.ToCharArray();
            
int length = arr.Length;
            
for (int k = 0; k < length; k++)
            {
                
int x1 = k;
                
int y1 = int.Parse(arr[k].ToString());
                
for (int m = k + 1; m < length; m++)
                {
                    
int x2 = m;
                    
int y2 = int.Parse(arr[m].ToString());

                    
if (y1 == y2 || Math.Abs(x1 - x2) == Math.Abs(y1 - y2))
                        
return false;
                }
            }

            
return true;
        }
    }
}

 

Tag标签: 8皇后,算法
posted on 2008-08-19 17:54 沙加 阅读(272) 评论(0)  编辑 收藏 网摘 所属分类: 算法研究

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:


相关搜索:
8皇后 算法

相关链接: