• 没有理清的一段代码


    看了半天,没看明白是怎么实现的!

    ReaderWriter::ReadResult readNode(const std::string& fileName,const Options* options, bool buildKdTreeIfRequired=true)
    {
        ReaderWriter::ReadResult result;
        if (options && options->getReadFileCallback()) result = options->getReadFileCallback()->readNode(fileName,options);
        else if (_readFileCallback.valid()) result = _readFileCallback->readNode(fileName,options);
        else result = readNodeImplementation(fileName,options);
    
        if (buildKdTreeIfRequired) _buildKdTreeIfRequired(result, options);
    
        return result;
    }
    /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
     *
     * This library is open source and may be redistributed and/or modified under
     * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
     * (at your option) any later version.  The full license is in LICENSE file
     * included with this distribution, and on the openscenegraph.org website.
     *
     * This library is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * OpenSceneGraph Public License for more details.
    */
    
    #ifndef OSGDB_INPUT
    #define OSGDB_INPUT 1
    
    #include <osg/Image>
    #include <osg/Shader>
    #include <osg/Node>
    #include <osg/Drawable>
    #include <osg/StateAttribute>
    #include <osg/ArgumentParser>
    
    #include <osgDB/ReaderWriter>
    #include <osgDB/Options>
    
    #include <map>
    #include <string>
    
    namespace osgDB {
    
    /** basic structure for custom runtime inheritance checking */
    struct basic_type_wrapper {
        virtual ~basic_type_wrapper() {}
        virtual bool matches(const osg::Object *proto) const = 0;
    };
    
    /** a class template that checks inheritance between a given
        Object's class and a class defined at compile time through
            the template parameter T.
            This is used in conjunction with readObjectOfType() to
            specify an abstract class as reference type.
    **/
    template<class T>
    struct type_wrapper: basic_type_wrapper {
        bool matches(const osg::Object *proto) const
        {
            return dynamic_cast<const T*>(proto) != 0;
        }
    };
    
    /** deprecated. */
    class OSGDB_EXPORT Field
    {
        public:
    
            enum {
                MIN_CACHE_SIZE = 256
            };
    
            Field();
            Field(const Field& field);
            virtual ~Field();
    
            virtual Field& operator = (const Field& ic);
    
            void reset();
            void addChar(char c);
            int getNoCharacters() const { return _fieldCacheSize; }
    
            void setWithinQuotes(bool withinQuotes=true);
            bool getWithinQuotes();
    
            void setNoNestedBrackets(int no);
            int getNoNestedBrackets();
    
            enum FieldType
            {
                OPEN_BRACKET,
                CLOSE_BRACKET,
                STRING,
                WORD,
                REAL,
                INTEGER,
                BLANK,
                UNINITIALISED
            };
    
            FieldType getFieldType() const;
    
            bool isValid() const;
    
            bool isOpenBracket() const;
            bool isCloseBracket() const;
    
            bool isWord() const;
            bool matchWord(const char* str) const;
            bool matchWord(const char* str,int noCharacters) const;
    
            bool isString() const;
            bool matchString(const char* str) const;
            bool matchString(const char* str,int noCharacters) const;
            bool isQuotedString() const;
    
            const char* getStr() const;
            char* takeStr();
    
            bool isInt() const;
            bool matchInt(int i) const;
            bool getInt(int& i) const;
    
            bool isUInt() const;
            bool matchUInt(unsigned int i) const;
            bool getUInt(unsigned int& i) const;
    
            bool isFloat() const;
            bool matchFloat(float f) const;
            bool getFloat(float& f) const;
            bool getFloat(double& f) const;
    
            static FieldType calculateFieldType(const char* str,bool withinQuotes=false);
    
        protected:
    
            void _init();
            void _free();
            void _copy(const Field& ic);
    
            int _fieldCacheCapacity;
            int _fieldCacheSize;
            char* _fieldCache;
    
            mutable FieldType _fieldType;
    
            bool _withinQuotes;
    
            int _noNestedBrackets;
    
    };
    
    /** deprecated. */
    class OSGDB_EXPORT FieldReader
    {
        public:
    
            FieldReader();
            FieldReader(const FieldReader& ic);
            virtual ~FieldReader();
    
            virtual FieldReader& operator = (const FieldReader& ic);
    
            void attach(std::istream* input);
            void detach();
    
            virtual bool eof() const;
    
            bool readField(Field& fieldPtr);
            void ignoreField();
    
            /** no of unmatched `{' encountered so far in file*/
            int getNoNestedBrackets() const;
    
        private:
    
            bool _readField(Field* fieldPtr);
    
            void _init();
            void _free();
            void _copy(const FieldReader& ic);
    
            std::istream* _fin;
            bool _eof;
    
            bool findStartOfNextField();
    
            int _noNestedBrackets;
    
            bool _delimiterEatLookUp[256];
            bool _delimiterKeepLookUp[256];
    
    };
    
    /** deprecated. */
    class OSGDB_EXPORT FieldReaderIterator
    {
        public:
    
            enum {
                MINIMUM_FIELD_READER_QUEUE_SIZE = 10
            };
    
            FieldReaderIterator();
            FieldReaderIterator(const FieldReaderIterator& ic);
            virtual ~FieldReaderIterator();
    
            FieldReaderIterator& operator = (const FieldReaderIterator& ic);
    
            void attach(std::istream* input);
            void detach();
    
            virtual bool eof() const;
    
            FieldReader& getFieldReader() { return _reader; }
    
            void insert(int pos,Field* field);
            void insert(int pos,const char* str);
    
            Field& operator [] (int pos);
            Field& field (int pos);
    
            FieldReaderIterator& operator ++ ();
            FieldReaderIterator& operator += (int no);
    
            /** increments the iterator of the next simple field or
              * whole block if the current field[0] is an open bracket */
            void advanceOverCurrentFieldOrBlock();
            void advanceToEndOfCurrentBlock();
            void advanceToEndOfBlock(int noNestBrackets);
    
            bool matchSequence(const char* str);
    
            bool readSequence(const char* keyword,std::string& value);
            bool readSequence(const char* keyword,unsigned int& value);
            bool readSequence(const char* keyword,int& value);
            bool readSequence(const char* keyword,float& value);
            bool readSequence(const char* keyword,osg::Vec2f& value);
            bool readSequence(const char* keyword,osg::Vec3f& value);
            bool readSequence(const char* keyword,osg::Vec4f& value);
            bool readSequence(const char* keyword,osg::Vec2d& value);
            bool readSequence(const char* keyword,osg::Vec3d& value);
            bool readSequence(const char* keyword,osg::Vec4d& value);
    
            bool readSequence(std::string& value);
            bool readSequence(unsigned int& value);
            bool readSequence(int& value);
            bool readSequence(float& value);
            bool readSequence(osg::Vec2f& value);
            bool readSequence(osg::Vec3f& value);
            bool readSequence(osg::Vec4f& value);
            bool readSequence(osg::Vec2d& value);
            bool readSequence(osg::Vec3d& value);
            bool readSequence(osg::Vec4d& value);
    
        private:
    
            void _init();
            void _free();
            void _copy(const FieldReaderIterator& ic);
    
            FieldReader _reader;
    
            Field _blank;
    
            Field* _previousField;
    
            Field** _fieldQueue;
            int _fieldQueueSize;
            int _fieldQueueCapacity;
    
    };
    
    /** deprecated. */
    class OSGDB_EXPORT Input : public FieldReaderIterator
    {
        public:
    
            Input();
            virtual ~Input();
    
            void setOptions(const Options* options) { _options = options; }
            const Options* getOptions() const { return _options.get(); }
    
            virtual osg::Object*         readObjectOfType(const osg::Object& compObj);
            virtual osg::Object*         readObjectOfType(const basic_type_wrapper &btw);
    
    
            template<typename T>
            inline T* readObjectOfType()
            {
                return dynamic_cast<T*>(readObjectOfType(osgDB::type_wrapper<T>()));
            }
    
            virtual osg::Object*         readObject();
            virtual osg::Image*          readImage();
            virtual osg::Drawable*       readDrawable();
            virtual osg::StateAttribute* readStateAttribute();
            virtual osg::Uniform*        readUniform();
            virtual osg::Node*           readNode();
            virtual osg::Shader*         readShader();
    
            virtual osg::Object*         readObject(const std::string& fileName);
            virtual osg::Image*          readImage(const std::string& fileName);
            virtual osg::Node*           readNode(const std::string& fileName);
            virtual osg::Shader*         readShader(const std::string& fileName);
    
            virtual osg::Object*         getObjectForUniqueID(const std::string& uniqueID);
            virtual void                 registerUniqueIDForObject(const std::string& uniqueID,osg::Object* obj);
    
            typedef osg::ArgumentParser::Parameter Parameter;
    
            bool read(Parameter value1);
            bool read(Parameter value1, Parameter value2);
            bool read(Parameter value1, Parameter value2, Parameter value3);
            bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4);
            bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5);
            bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6);
            bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7);
            bool read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7, Parameter value8);
    
            bool read(const char* str);
            bool read(const char* str, Parameter value1);
            bool read(const char* str, Parameter value1, Parameter value2);
            bool read(const char* str, Parameter value1, Parameter value2, Parameter value3);
            bool read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4);
            bool read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5);
            bool read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6);
            bool read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7);
            bool read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7, Parameter value8);
    
        private:
    
            typedef std::map< std::string, osg::ref_ptr<osg::Object> > UniqueIDToObjectMapping;
            UniqueIDToObjectMapping _uniqueIDToObjectMap;
    
            osg::ref_ptr<const Options> _options;
    
    };
    
    }
    
    #endif                                            // __SG_INPUT_H
    /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
     *
     * This library is open source and may be redistributed and/or modified under
     * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
     * (at your option) any later version.  The full license is in LICENSE file
     * included with this distribution, and on the openscenegraph.org website.
     *
     * This library is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * OpenSceneGraph Public License for more details.
    */
    #include <osg/Object>
    
    #include <osgDB/Registry>
    #include <osgDB/ReadFile>
    #include <osgDB/Input>
    
    using namespace osgDB;
    
    Input::Input()
    {
    }
    
    
    Input::~Input()
    {
    }
    
    
    osg::Object* Input::getObjectForUniqueID(const std::string& uniqueID)
    {
        UniqueIDToObjectMapping::iterator fitr = _uniqueIDToObjectMap.find(uniqueID);
        if (fitr != _uniqueIDToObjectMap.end()) return (*fitr).second.get();
        else return NULL;
    }
    
    
    void Input::registerUniqueIDForObject(const std::string& uniqueID,osg::Object* obj)
    {
        _uniqueIDToObjectMap[uniqueID] = obj;
    }
    
    
    osg::Object* Input::readObjectOfType(const osg::Object& compObj)
    {
        return Registry::instance()->getDeprecatedDotOsgObjectWrapperManager()->readObjectOfType(compObj,*this);
    }
    
    osg::Object* Input::readObjectOfType(const basic_type_wrapper &btw)
    {
        return Registry::instance()->getDeprecatedDotOsgObjectWrapperManager()->readObjectOfType(btw,*this);
    }
    
    osg::Object* Input::readObject()
    {
        return Registry::instance()->getDeprecatedDotOsgObjectWrapperManager()->readObject(*this);
    }
    
    
    osg::Image*  Input::readImage()
    {
        return Registry::instance()->getDeprecatedDotOsgObjectWrapperManager()->readImage(*this);
    }
    
    osg::Drawable* Input::readDrawable()
    {
        osg::Drawable* drawable = Registry::instance()->getDeprecatedDotOsgObjectWrapperManager()->readDrawable(*this);
        osg::Geometry* geometry = drawable ? drawable->asGeometry() : 0;
        if (geometry && geometry->containsDeprecatedData()) geometry->fixDeprecatedData();
        return drawable;
    }
    
    osg::StateAttribute* Input::readStateAttribute()
    {
        return Registry::instance()->getDeprecatedDotOsgObjectWrapperManager()->readStateAttribute(*this);
    }
    osg::Uniform* Input::readUniform()
    {
        return Registry::instance()->getDeprecatedDotOsgObjectWrapperManager()->readUniform(*this);
    }
    
    osg::Node* Input::readNode()
    {
        return Registry::instance()->getDeprecatedDotOsgObjectWrapperManager()->readNode(*this);
    }
    
    osg::Object* Input::readObject(const std::string& fileName)
    {
        return readObjectFile(fileName,_options.get());
    }
    
    osg::Shader*  Input::readShader()
    {
        return Registry::instance()->getDeprecatedDotOsgObjectWrapperManager()->readShader(*this);
    }
    
    osg::Image*  Input::readImage(const std::string& fileName)
    {
        return readImageFile(fileName,_options.get());
    }
    
    osg::Node* Input::readNode(const std::string& fileName)
    {
        return readNodeFile(fileName,_options.get());
    }
    
    osg::Shader*  Input::readShader(const std::string& fileName)
    {
        return readShaderFile(fileName,_options.get());
    }
    
    bool Input::read(Parameter value1)
    {
        if (value1.valid((*this)[0].getStr()))
        {
            value1.assign((*this)[0].getStr());
            (*this) += 1;
            return true;
        }
        else return false;
    }
    
    bool Input::read(Parameter value1, Parameter value2)
    {
        if (value1.valid((*this)[0].getStr()) &&
            value2.valid((*this)[1].getStr()))
        {
            value1.assign((*this)[0].getStr());
            value2.assign((*this)[1].getStr());
            (*this) += 2;
            return true;
        }
        else return false;
    }
    
    bool Input::read(Parameter value1, Parameter value2, Parameter value3)
    {
        if (value1.valid((*this)[0].getStr()) &&
            value2.valid((*this)[1].getStr()) &&
            value3.valid((*this)[2].getStr()))
        {
            value1.assign((*this)[0].getStr());
            value2.assign((*this)[1].getStr());
            value3.assign((*this)[2].getStr());
            (*this) += 3;
            return true;
        }
        else return false;
    }
    
    bool Input::read(Parameter value1, Parameter value2, Parameter value3, Parameter value4)
    {
        if (value1.valid((*this)[0].getStr()) &&
            value2.valid((*this)[1].getStr()) &&
            value3.valid((*this)[2].getStr()) &&
            value4.valid((*this)[3].getStr()))
        {
            value1.assign((*this)[0].getStr());
            value2.assign((*this)[1].getStr());
            value3.assign((*this)[2].getStr());
            value4.assign((*this)[3].getStr());
            (*this) += 4;
            return true;
        }
        else return false;
    }
    
    bool Input::read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5)
    {
        if (value1.valid((*this)[0].getStr()) &&
            value2.valid((*this)[1].getStr()) &&
            value3.valid((*this)[2].getStr()) &&
            value4.valid((*this)[3].getStr()) &&
            value5.valid((*this)[4].getStr()))
        {
            value1.assign((*this)[0].getStr());
            value2.assign((*this)[1].getStr());
            value3.assign((*this)[2].getStr());
            value4.assign((*this)[3].getStr());
            value5.assign((*this)[4].getStr());
            (*this) += 5;
            return true;
        }
        else return false;
    }
    
    bool Input::read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6)
    {
        if (value1.valid((*this)[0].getStr()) &&
            value2.valid((*this)[1].getStr()) &&
            value3.valid((*this)[2].getStr()) &&
            value4.valid((*this)[3].getStr()) &&
            value5.valid((*this)[4].getStr()) &&
            value6.valid((*this)[5].getStr()))
        {
            value1.assign((*this)[0].getStr());
            value2.assign((*this)[1].getStr());
            value3.assign((*this)[2].getStr());
            value4.assign((*this)[3].getStr());
            value5.assign((*this)[4].getStr());
            value6.assign((*this)[5].getStr());
            (*this) += 6;
            return true;
        }
        else return false;
    }
    
    bool Input::read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7)
    {
        if (value1.valid((*this)[0].getStr()) &&
            value2.valid((*this)[1].getStr()) &&
            value3.valid((*this)[2].getStr()) &&
            value4.valid((*this)[3].getStr()) &&
            value5.valid((*this)[4].getStr()) &&
            value6.valid((*this)[5].getStr()) &&
            value7.valid((*this)[6].getStr()))
        {
            value1.assign((*this)[0].getStr());
            value2.assign((*this)[1].getStr());
            value3.assign((*this)[2].getStr());
            value4.assign((*this)[3].getStr());
            value5.assign((*this)[4].getStr());
            value6.assign((*this)[5].getStr());
            value7.assign((*this)[6].getStr());
            (*this) += 7;
            return true;
        }
        else return false;
    }
    
    bool Input::read(Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7, Parameter value8)
    {
        if (value1.valid((*this)[0].getStr()) &&
            value2.valid((*this)[1].getStr()) &&
            value3.valid((*this)[2].getStr()) &&
            value4.valid((*this)[3].getStr()) &&
            value5.valid((*this)[4].getStr()) &&
            value6.valid((*this)[5].getStr()) &&
            value7.valid((*this)[6].getStr()) &&
            value8.valid((*this)[7].getStr()))
        {
            value1.assign((*this)[0].getStr());
            value2.assign((*this)[1].getStr());
            value3.assign((*this)[2].getStr());
            value4.assign((*this)[3].getStr());
            value5.assign((*this)[4].getStr());
            value6.assign((*this)[5].getStr());
            value7.assign((*this)[6].getStr());
            value8.assign((*this)[7].getStr());
            (*this) += 8;
            return true;
        }
        else return false;
    }
    
    bool Input::read(const char* str)
    {
        if ((*this)[0].matchWord(str))
        {
            (*this) += 1;
            return true;
        }
        else return false;
    }
    
    bool Input::read(const char* str, Parameter value1)
    {
        if ((*this)[0].matchWord(str) && value1.valid((*this)[1].getStr()))
        {
            value1.assign((*this)[1].getStr());
            (*this) += 2;
            return true;
        }
        else return false;
    }
    
    bool Input::read(const char* str, Parameter value1, Parameter value2)
    {
        if ((*this)[0].matchWord(str) &&
            value1.valid((*this)[1].getStr()) &&
            value2.valid((*this)[2].getStr()))
        {
            value1.assign((*this)[1].getStr());
            value2.assign((*this)[2].getStr());
            (*this) += 3;
            return true;
        }
        else return false;
    }
    
    bool Input::read(const char* str, Parameter value1, Parameter value2, Parameter value3)
    {
        if ((*this)[0].matchWord(str) &&
            value1.valid((*this)[1].getStr()) &&
            value2.valid((*this)[2].getStr()) &&
            value3.valid((*this)[3].getStr()))
        {
            value1.assign((*this)[1].getStr());
            value2.assign((*this)[2].getStr());
            value3.assign((*this)[3].getStr());
            (*this) += 4;
            return true;
        }
        else return false;
    }
    
    bool Input::read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4)
    {
        if ((*this)[0].matchWord(str) &&
            value1.valid((*this)[1].getStr()) &&
            value2.valid((*this)[2].getStr()) &&
            value3.valid((*this)[3].getStr()) &&
            value4.valid((*this)[4].getStr()))
        {
            value1.assign((*this)[1].getStr());
            value2.assign((*this)[2].getStr());
            value3.assign((*this)[3].getStr());
            value4.assign((*this)[4].getStr());
            (*this) += 5;
            return true;
        }
        else return false;
    }
    
    bool Input::read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5)
    {
        if ((*this)[0].matchWord(str) &&
            value1.valid((*this)[1].getStr()) &&
            value2.valid((*this)[2].getStr()) &&
            value3.valid((*this)[3].getStr()) &&
            value4.valid((*this)[4].getStr()) &&
            value5.valid((*this)[5].getStr()))
        {
            value1.assign((*this)[1].getStr());
            value2.assign((*this)[2].getStr());
            value3.assign((*this)[3].getStr());
            value4.assign((*this)[4].getStr());
            value5.assign((*this)[5].getStr());
            (*this) += 6;
            return true;
        }
        else return false;
    }
    
    bool Input::read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6)
    {
        if ((*this)[0].matchWord(str) &&
            value1.valid((*this)[1].getStr()) &&
            value2.valid((*this)[2].getStr()) &&
            value3.valid((*this)[3].getStr()) &&
            value4.valid((*this)[4].getStr()) &&
            value5.valid((*this)[5].getStr()) &&
            value6.valid((*this)[6].getStr()))
        {
            value1.assign((*this)[1].getStr());
            value2.assign((*this)[2].getStr());
            value3.assign((*this)[3].getStr());
            value4.assign((*this)[4].getStr());
            value5.assign((*this)[5].getStr());
            value6.assign((*this)[6].getStr());
            (*this) += 7;
            return true;
        }
        else return false;
    }
    
    bool Input::read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7)
    {
        if ((*this)[0].matchWord(str) &&
            value1.valid((*this)[1].getStr()) &&
            value2.valid((*this)[2].getStr()) &&
            value3.valid((*this)[3].getStr()) &&
            value4.valid((*this)[4].getStr()) &&
            value5.valid((*this)[5].getStr()) &&
            value6.valid((*this)[6].getStr()) &&
            value7.valid((*this)[7].getStr()))
        {
            value1.assign((*this)[1].getStr());
            value2.assign((*this)[2].getStr());
            value3.assign((*this)[3].getStr());
            value4.assign((*this)[4].getStr());
            value5.assign((*this)[5].getStr());
            value6.assign((*this)[6].getStr());
            value7.assign((*this)[7].getStr());
            (*this) += 8;
            return true;
        }
        else return false;
    }
    
    bool Input::read(const char* str, Parameter value1, Parameter value2, Parameter value3, Parameter value4, Parameter value5, Parameter value6, Parameter value7, Parameter value8)
    {
        if ((*this)[0].matchWord(str) &&
            value1.valid((*this)[1].getStr()) &&
            value2.valid((*this)[2].getStr()) &&
            value3.valid((*this)[3].getStr()) &&
            value4.valid((*this)[4].getStr()) &&
            value5.valid((*this)[5].getStr()) &&
            value6.valid((*this)[6].getStr()) &&
            value7.valid((*this)[7].getStr()) &&
            value8.valid((*this)[8].getStr()))
        {
            value1.assign((*this)[1].getStr());
            value2.assign((*this)[2].getStr());
            value3.assign((*this)[3].getStr());
            value4.assign((*this)[4].getStr());
            value5.assign((*this)[5].getStr());
            value6.assign((*this)[6].getStr());
            value7.assign((*this)[7].getStr());
            value8.assign((*this)[8].getStr());
            (*this) += 9;
            return true;
        }
        else return false;
    }

    #################################3

    QQ 3087438119
  • 相关阅读:
    HDU 3277 Marriage Match III(最大流+二分+并查集)
    HDU 3032 Nim or not Nim?(博弈,打表找规律)
    2013南京邀请赛小结——ACM两年总结
    HDU 2829 Lawrence (斜率DP)
    HDU 3530 Subsequence(单调队列)
    HDU 1525 Euclid's Game(博弈)
    C Count The Carries(2013南京邀请赛C题)
    A Play the Dice (2013南京邀请赛A题)
    POJ 3017 Cut the Sequence(单调队列+set)
    Jquery TreeView
  • 原文地址:https://www.cnblogs.com/herd/p/15220768.html
Copyright © 2020-2023  润新知