李虹霖

 

回溯算法之火力网

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

namespace SeqListSort
{
    /// <summary>
    /// <ather>
    /// lihonglin
    /// </ather>
    /// <content>
    /// 在一个n*n的网格里,每个网格可能为“墙壁”(用‘X’表示)和“街道”(用‘.’表示)。现在在街道
    /// 放置碉堡,每个碉堡可以向上下左右四个方向开火,子弹射程无限远。墙壁可以阻挡子弹。问最多能放置
    /// 多少个碉堡,使它们彼此不会互相摧毁。
    /// 
    /// 之前的8皇后是一行或者一列只能放一个,而火力网一行列可能有多个,或者一个也没有,所以回溯的
    /// 递归要多一个判断没有放置任何碉堡
    /// </content>
    /// </summary>
    class FireNet
    {
        public static char[,] map = new char[4,4];//地图最大为4行4列
        public static int maxNum = 0; // 最大放置碉堡个数
        public static int n;// 创建地图的行列个数

        public static void InitMap()
        {
            Console.WriteLine("请输入地图的行数(n> 0 && n <5)");
            n = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("请输入地图的数据‘x’表示墙,'.'表示街道");
            for (int i = 0; i < n; ++i )
            {
                for (int j = 0; j < n; ++j )
                {
                    map[i, j] = Convert.ToChar( Console.Read() );
                }
                Console.ReadLine();
            }
            PutShooter(0,0);
        }
        // 放置碉堡
        public static void PutShooter(int k, int curNum)// 参数k,得到行列数,curNum当前碉堡数
        {
            int i = 0;
            int j = 0;
            // 结束条件
            if ( k == n * n )
            {
                if ( curNum >= maxNum )//当前碉堡数 》最大碉堡数停止
                {
                    // 输出  保存当前路径的最大值
                    maxNum = curNum;
                    Console.WriteLine("最多能放碉堡数 = " + maxNum);
                    return;
                }
            }
            else
            {
                i = k / n;// row
                j = k % n;//col
                if ((map[i,j] == '.') && IsOK(i,j))//是街道,并且有墙阻挡,可以放置碉堡
                {
                    map[i, j] = 'o';
                    PutShooter(k + 1, curNum + 1);// 继续检测下一列
                    map[i, j] = '.';//回溯
                }
                // 当前点不能放置或者回溯回来
                PutShooter(k + 1, curNum);
            }
        }
        public virtual void text()
        {
            string str1 = "a";
            string str2 = str1;
            //str1="a"+"b";
            Console.WriteLine("str1 = " + str1.GetHashCode() + "str2= " + str2.GetHashCode());
        }
        
        //放置的条件
        public static bool IsOK(int row, int col)
        {
            for (int i = row - 1; i >= 0; --i )//检测每一列
            {
                if (map[i,col] == 'o')// 当前位置已有碉堡
                {
                    return false;
                }
                if (map[i, col] == 'x') break;// 当前为墙,可以放置
            }
            // 检测每一行是否可放
            for (int j = col - 1; j >= 0; --j )
            {
                if (map[row,j] == 'o')
                {
                    return false;
                }
                if (map[row, j] == 'x') break;
            }
            return true;
        }
    }
}

 

posted on 2015-03-02 01:15  lol霖  阅读(282)  评论(0编辑  收藏  举报

导航