笔试题集六(思维拓展)

 

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

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2019-05-02 18:59  NCat  阅读(152)  评论(0)    收藏  举报