• main


    #include "stdio.h"
    #include "map"
    #include "string"
    #include "iostream"
    using namespace std;
    
    int u[4] = {0, 0, 1, -1};
    int v[4] = {1, -1, 0, 0};
    
    
    // global
    map<string, int>	g_SCORE;
    int 			    g_BEST_SCORE;
    int                 g_mapSize, g_mapSize_old;
    
    
    // funcs definition
    void globalInit()
    {
        g_SCORE.clear();
    	g_BEST_SCORE = 1;
    	g_mapSize = 0;
    	g_mapSize_old = 0;
    }
    
    string readMapsRslt()
    {
        string x = "2441353511212251124434445434222131423443424144521211224115341251131145244144441542544531313321521455";
        return x;
    }
    
    bool checkSingle(string tmpState, int p)
    {
        int x = p/10 + 1;
        int y = p%10 + 1;
        for(int i=0; i<4; ++i) {
            int nx = x + u[i];
            int ny = y + v[i];
            if ( nx>=1 && nx<=10 && ny>=1 && ny<=10 ) {
                int np = (nx-1)*10+ny-1;
                if ( tmpState[p] == tmpState[np] ) return false;
            }
        }
        return true;
    }
    
    int destroy(string &State, int p)
    {
        int Q[105];
        int head=0;
        int tail=1;
        char COLOR = State[p];
        Q[tail] = p;
    
        State[p] = '0';
    
        while( head<tail ) {
            ++head;
            int pp = Q[head];
            int x = pp/10 + 1;
            int y = pp%10 + 1;
            for(int i=0; i<4; ++i) {
                int nx = x + u[i];
                int ny = y + v[i];
                if ( nx>=1 && nx<=10 && ny>=1 && ny<=10 ) {
                    int np = (nx-1)*10+ny-1;
                    if ( State[np] == COLOR ) {
                        Q[++tail] = np;
                        State[np] = '0';
                    }
                }
            }
        }
        return tail;
    }
    
    bool colIsEmpty(string &State, int col)
    {
        for( int x=1; x<=10; ++x) {
            int p = (x-1)*10+col-1;
            if( State[p] != '0' ) {
                return false;
            }
        }
        return true;
    }
    
    void update(string &State)
    {
        for (int x=10; x>=1; --x) {
            for (int y=1; y<=10; ++y) {
                int p = (x-1)*10+y-1;
                if ( State[p] == '0' ) continue;
                while ( p+10<100 && State[p+10] == '0' ) {
                    State[p+10] = State[p];
                    State[p] = '0';
                    p += 10;
                }
            }
        }
        for (int y=1; y<=10; ++y) {
            if ( colIsEmpty(State, y) == true ) continue;
            int tmpy = y;
            while ( tmpy > 1 && colIsEmpty(tmpy-1) == true ) {
                for(int x=1; x<=10; ++x) {
                    int p = (x-1)*10+tmp-1;
                    State[p-1] = State[p];
                    State[p] = '0';
                }
                tmpy--;
            }
        }
    }
    
    void printt(string state, int score)
    {
        cout << "SCORE: " << score << "   mapSize: " << g_mapSize << endl;
        for (int x=1; x<=10; ++x) {
            for (int y=1; y<=10; ++y) {
                int p = (x-1)*10+y-1;
                if ( state[p] == '0' ) cout << " "; else cout << state[p];
            }
            cout << endl;
        }
        cout << "---------------------------------" << endl;
    }
    int exploreFromState(string state)
    {
    	int sco = g_SCORE[state];
    	if ( sco != 0 ) {
    		return sco;
    	}
    
    	string tmpState = state;
        int tmpMax = 1;
    
        for (int p=0; p<100; ++p) {
            if ( tmpState[p] == '0' ) continue;
            if ( checkSingle(state, p) == true ) continue;
            destroy(tmpState, p);
            string state2 = state;
            int cnt = destroy(state2, p);
            update(state2);
            tmpMax = max( tmpMax, exploreFromState(state2) + 5*cnt*cnt);
        }
    
        g_SCORE[state] = tmpMax;
        g_mapSize++;
    
        if(tmpMax > g_BEST_SCORE) {
            g_BEST_SCORE = tmpMax;
            //printt(state, g_BEST_SCORE);
            //cout << state << " : " << g_BEST_SCORE << endl;
            //g_BEST_SCORE = 999999;
        }
        printt(state, g_BEST_SCORE);
    
        return tmpMax;
    }
    
    void proc(string initState)
    {
    	g_BEST_SCORE = exploreFromState(initState);
    	cout << g_BEST_SCORE << endl;
    }
    
    void test1()
    {
        string x = "2441353511212251124434445434222131423443424144521211224115341251131145244144441542544531313321521400";
        update(x);
        printt(x, 1);
    }
    int main()
    {
        //test1();
    	globalInit();
    	string initState = readMapsRslt();
    	proc(initState);
    
    	return 0;
    }
    

      

  • 相关阅读:
    Hua Dan stories | Hua Dan
    字典树(前缀树)的应用 乖兔子的专栏 博客频道 CSDN.NET
    《算法精解:C语言描述》勘误
    curl
    javascript实现的gzip压缩(deflate)和解压缩(inflate)算法 sudone.com服务器系统架构分析日志
    python处理gzip压缩的http数据 XII 博客大巴
    Zlib与GZip woaidongmao C++博客
    文件压缩/解压算法 cutepig 博客园
    url
    转:Ubuntu Terminal 使用和常用快捷键
  • 原文地址:https://www.cnblogs.com/fish7/p/6927009.html
Copyright © 2020-2023  润新知