• 高校挑战赛:观看世界杯--限制排序算法


    试题来源:http://student.csdn.net/mcs/programming_challenges?&page=1  观看世界杯

      

      以前在学校参加每年的ACM程序设计大赛,感觉程序算法还是挺有意思的,这两天发现一个网站上放出一些算法试题,有点当年的那种心情,看到了,感觉能干掉,那就干掉它。目前还在公司守夜中,闲着没事就试了试算法题。

      速手打,没有详细检查,可能有瑕疵请见谅,但是读题、解题、算法设计,一个不少。

     if(type == 1){...} 这段里,虽然写的有点小复杂,但是是个简单的优化,呵呵。

      做事前,先看清,再下手。程序猿时间有限,不要随意浪费,错误的解读,终会造成一个不正确的结果。

    class Program
        {
            /*
             *     世界杯正在火热进行中,室友不惜睡眠时间,凌晨起来观看,但Njzy对此不是很感兴趣,他在思考一个问题: 
             * 假设世界杯观看台上有n个座位,排成一排,游客们来到这里自由占位。一般情况下,一个游客首先考虑的座位
             * 肯定是两边都没人的座位,其次考虑的是一边没人的座位,最后没得考虑,只能随便选一张两边都是人的座位。
             * 假设有n个游客依次到场占位,每个人都是按照上述规则选择自己的位子,Njzy就在思考这n个游客占位的可能顺
             * 序有多少种,你能帮助他? 输入描述: 有多组测试数据,每组测试数据包括一个正整数n(0<n<1000000)。 输出
             * 描述: 对于每组数据,由于答案可能会很大,所以输出:答案%1000000007
             * 
             * **************************************
             * 
             * 首先仔细读题:
             *  1.世界杯观看台上有n个座位,这n个座位有n个依次到场的游客来坐。
             *    解析:这里面隐藏两点(这两点很重要,如果没有读出这两点,计算会非常复杂):
             *                  a.座位数等于游客数
             *                  b.游客有入场顺序(此题中游客的入场顺序为1,2,3,4...)
             * (限制型排序算法)                 
             * 
             *                  
             *  2.首先考虑的座位肯定是两边都没人
             *  
             *  3.其次考虑的是一边没人的座位
             *  
             *  4.只能随便选一张两边都是人的座位
             *  
             * 
             * 输出结果:
             * 表示游客的选座方法(顺序号对应游客的入场顺序)。
             * 
             * 
             * 修改 _PersonCount 的值表示入场的人数(座数),为题中n(0<n<1000000)
             * 如果只求出总选座的方法,可以注释 Console.WriteLine(string.Join(",", _SiteArray));
             * 没有输出,提高程序的计算效率。
             */
    
            static void Main(string[] args)
            {
                //假设:人数、座位数(1,2,3...表示游客的入场顺序)
                int _PersonCount = 4;
    
                int[] _SiteArray = new int[_PersonCount];
    
                int personIndex = 1;
                int type = 2;
    
                switch (_SiteArray.Length)
                {
                    case 0: type = -1; break;
                    case 1: type = 0; break;
                    case 2: type = 1; break;
                    case 3: type = 2; break;
                    default: type = 2; break;
                }
    
                FuncRun(ref _SiteArray, ref personIndex,  type);
    
                Console.WriteLine("总共 {0} 种选座的方法",ResCount);
            }
    
            static void Swap(ref int l, ref int r)
            {
                l = l ^ r;
                r = l ^ r;
                l = l ^ r;
            }
    
            static int ResCount = 0;
    
            static void FuncRun(ref int[] _SiteArray, ref int personIndex,  int type)
            {
                if (personIndex > _SiteArray.Length)
                {
                    Console.WriteLine(string.Join(",", _SiteArray));
                    ResCount++;
                    return;
                }
    
                if (type == 2)
                {
                    //---------------------------------------------------
                    //首先考虑的座位肯定是两边都没人
                    for (int i = 1; i < _SiteArray.Length - 1; i++)
                    {
                        if (_SiteArray[i] > 0)
                            continue;
    
                        if (_SiteArray[i - 1] == 0 && _SiteArray[i + 1] == 0)
                        {
                            _SiteArray[i] = personIndex++;
                            FuncRun(ref _SiteArray, ref personIndex,  type);
                            //数据恢复
                            personIndex--;
                            _SiteArray[i] = 0;
                        }
                    }
                    type--;
                }
    
                //---------------------------------------------------
                //其次考虑的是一边没人的座位
                if (type == 1)
                {
                    if (personIndex <= 1 || _SiteArray.Length < 3)
                        return;
    
                    if (_SiteArray[0] == 0 && _SiteArray[1] == 0)
                    {
                        _SiteArray[0] = personIndex++;
                        FuncRun(ref _SiteArray, ref personIndex,  type);
                        //数据恢复
                        personIndex--;
                        _SiteArray[0] = 0;
                    }
    
                    for (int i = 1; i < _SiteArray.Length - 1; i++)
                    {
                        if (_SiteArray[i] > 0)
                            continue;
    
                        if (_SiteArray[i - 1] == 0)
                        {
                            _SiteArray[i] = personIndex++;
                            FuncRun(ref _SiteArray, ref personIndex,  type);
                            //数据恢复
                            personIndex--;
                            _SiteArray[i] = 0;
                        }
                        else if (_SiteArray[i + 1] == 0)
                        {
                            _SiteArray[i] = personIndex++;
                            FuncRun(ref _SiteArray, ref personIndex,  type);
                            //数据恢复
                            personIndex--;
                            _SiteArray[i] = 0;
                        }
                    }
    
                    if (_SiteArray[_SiteArray.Length - 1] == 0 && _SiteArray[_SiteArray.Length - 2] == 0)
                    {
                        _SiteArray[_SiteArray.Length - 1] = personIndex++;
                        FuncRun(ref _SiteArray, ref personIndex,  type);
                        //数据恢复
                        personIndex--;
                        _SiteArray[_SiteArray.Length - 1] = 0;
                    }
                    type--;
                }
    
                //---------------------------------------------------
                //只能随便选一张两边都是人的座位
                if (type == 0)
                {
                    for (int i = 0; i < _SiteArray.Length; i++)
                    {
                        if (_SiteArray[i] == 0)
                        {
                            _SiteArray[i] = personIndex++;
                            FuncRun(ref _SiteArray, ref personIndex,  type);
                            //数据恢复
                            personIndex--;
                            _SiteArray[i] = 0;
                        }
                    }
                }
            }
        }
  • 相关阅读:
    嵌入式:使用dd命令制作烧写文件
    C: 函数的名字是否受大小写影响?
    C++:互斥量C++实现,内存调试,自动锁
    linux环境ubuntu: pushd: not found
    3. 海思Hi3519A MPP从入门到精通(三 视频输入)
    详解YUV数据格式
    海思Hi3519A MPP从入门到精通(二 系统控制)
    海思Hi3519A MPP从入门到精通(一 系统概述)
    HiGV ui代码流程
    音视频学习路线
  • 原文地址:https://www.cnblogs.com/preacher/p/4093380.html
Copyright © 2020-2023  润新知