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; } } }