笔试题集六(思维拓展)
251. 62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号)似等式成立,如何移动?
6移动到2的后上方,使之成为2的6次方
252. 有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
namespace ConsoleApplication1 { class Program { //输出记录 public static StringBuilder OutPutLog=new StringBuilder(); //轮次 public static int Turn = 0; internal static void Main(string[] args) { //共32轮,也就是32种情况 for (int i = -1; i < 2; i += 2) { for (int ii = -1; ii < 2; ii += 2) { for (int iii = -1; iii < 2; iii += 2) { for (int iiii = -1; iiii < 2; iiii += 2) { for (int iiiii = -1; iiiii < 2; iiiii += 2) { //轮次 Turn++; List<Ant> ants = new List<Ant>() { new Ant() { Num=1,Position=3,Direction=i,State=AntStateEnum.在移动}, new Ant() { Num=2,Position=7,Direction=ii,State=AntStateEnum.在移动}, new Ant() { Num=3,Position=11,Direction=iii,State=AntStateEnum.在移动}, new Ant() { Num=4,Position=17,Direction=iiii,State=AntStateEnum.在移动}, new Ant() { Num=5,Position=23,Direction=iiiii,State=AntStateEnum.在移动}, }; //输出该轮次信息 OutPutLog.Append(string.Format("第{0}轮,初始方向:【{1}号 {2}】|【{3}号 {4}】|【{5}号 {6}】|【{7}号 {8}】|【{9}号 {10}】, ", Turn < 10 ? "0" + Turn : Turn + "", ants.First(o => o.Num == 1).Num, ants.First(o => o.Num == 1).Direction < 0 ? "←" : "→", ants.First(o => o.Num == 2).Num, ants.First(o => o.Num == 2).Direction < 0 ? "←" : "→", ants.First(o => o.Num == 3).Num, ants.First(o => o.Num == 4).Direction < 0 ? "←" : "→", ants.First(o => o.Num == 4).Num, ants.First(o => o.Num == 4).Direction < 0 ? "←" : "→", ants.First(o => o.Num == 5).Num, ants.First(o => o.Num == 5).Direction < 0 ? "←" : "→")); //该轮次计时 int timer = 0; StringBuilder curInfo = new StringBuilder(); AntRun(ants, ref timer, ref curInfo, true, 17); OutPutLog.Append(string.Format("历时:{0}秒 \n", timer)); OutPutLog.AppendLine(curInfo.ToString()); } } } } } Log.WriteLog(OutPutLog.ToString()); } /// <summary> /// 蚂蚁开始运动 /// </summary> /// <param name="antList"></param> /// <param name="timer"></param> /// <param name="curInfo">当前轮次位置信息</param> /// <param name="isPrintCurrentTrun">是否打印当前轮次位置信息</param> /// <param name="printTurn">当前轮</param> public static void AntRun(List<Ant> antList, ref int timer, ref StringBuilder curInfo, bool isPrintCurrentTrun = false, int printTurn = 0) { #region 输出当前蚂蚁位置信息 if (isPrintCurrentTrun && Turn == printTurn) { curInfo.Append(string.Format("\t 历时{0}秒,蚂蚁当前位置:", timer)); foreach (var ant in antList) curInfo.Append(string.Format("{0}号:{1},", ant.Num, ant.Position)); curInfo.Append("\n"); } #endregion #region 计算接下来蚂蚁的行径 //运动 foreach (Ant item in antList) { if (item.Position <= 0 || item.Position >= 25) item.State = AntStateEnum.已离开; if (item.State == AntStateEnum.在移动) item.Position += item.Direction; } //相遇后改变彼此方向 List<int> indexList=new List<int>(); foreach (Ant ant1 in antList) { foreach (Ant ant2 in antList) { if (Math.Abs(ant1.Position - ant2.Position) <= 1 && ant1.Direction != ant2.Direction && !ant1.Equals(ant2)) { indexList.Add(antList.IndexOf(ant1)); } } } foreach (var index in indexList) antList[index].Direction *= -1; #endregion if (antList.All(ant => ant.State != AntStateEnum.在移动)) return; timer++; AntRun(antList, ref timer,ref curInfo, isPrintCurrentTrun, printTurn); } public class Ant { /// <summary> /// 蚂蚁编号(0-5) /// </summary> public int Num { get; set; } /// <summary> /// 当前位置 /// </summary> public int Position { get; set; } /// <summary> /// 当前方向(0=向左,1=向右) /// </summary> public int Direction { get; set; } /// <summary> /// 蚂蚁当前状态 /// </summary> public AntStateEnum State { get; set; } } /// <summary> /// 蚂蚁状态美剧 /// </summary> public enum AntStateEnum { 在移动 = 1, 已离开 = 0 } } /// <summary> /// 日志记录 /// </summary> public class Log { public static void WriteLog(string content) { FileStream fs = new FileStream("E:\\log.txt", FileMode.Create); StreamWriter sw=new StreamWriter(fs); sw.Write(content); sw.Flush(); sw.Close(); fs.Close(); } } }
253. 有两个数组a,b,大小都为n,数组元素的值任意整形数,无序;
要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小。
class Program { static void Main(string[] args) { List<int> list1 = new List<int>() { 1, 3, 5, 7, 9, 11, 14, 13, 12, 18, 99, 22 }; List<int> list2 = new List<int>() { 0, 2, 4, 6, 8, 10, 17, 16, 15, 21, 111, 33 }; list1 = list1.OrderBy(o => o).ToList(); list2 = list2.OrderBy(o => o).ToList(); int length = list2.Count; int sum1 = 0; int sum2 = 0; for (int index = 0; index < length; index++) { if (list1[index] > list2[index] && sum1 > sum2 || list1[index] < list2[index] && sum1 < sum2) { list1[index] = list1[index] + list2[index]; list2[index] = list1[index] - list2[index]; list1[index] = list1[index] - list2[index]; } sum1 += list1[index]; sum2 += list2[index]; } Console.Write("list1:"); list1.ForEach(delegate (int item) { Console.Write(item + ","); }); Console.Write("sum1:{0}\n", sum1); Console.Write("list2:"); list2.ForEach(delegate (int item) { Console.Write(item + ","); }); Console.Write("sum2:{0}\n", sum2); } }
真正的大师永远怀着一颗学徒的心。

浙公网安备 33010602011771号