zoukankan      html  css  js  c++  java
  • popStar手机游戏机机对战程序

    DFS算,五分钟如果答案没有更新,那个解一般来说就很优了。

    #include <cstdio>
    #include <iostream>
    #include <string.h>
    #include <cstdlib>
    #include <algorithm>
    #include <queue>
    #include <vector>
    #include <cmath>
    #include <map>
    #include <stack>
    using namespace std;
    int const uu[4] = {1,-1,0,0};
    int const vv[4] = {0,0,1,-1};
    typedef long long ll;
    int const inf = 0x3f3f3f3f;
    ll const INF = 0x7fffffffffffffffll;
    double eps = 1e-10;
    double pi = acos(-1.0);
    #define rep(i,s,n) for(int i=(s);i<=(n);++i)
    #define rep2(i,s,n) for(int i=(s);i>=(n);--i)
    #define mem(v,n) memset(v,(n),sizeof(v))
    #define lson l, m, rt<<1
    #define rson m+1, r, rt<<1|1
    struct node{
        int x,y;
    }tempAns[205],Ans[205];
    
    
    char FIRST[101][101];
    bool VIS[101][101];
    int bestScore;
    int STEP;
    
    bool check(char mp[101][101],int x,int y){
        rep(k,0,3){
            int xx=x+uu[k], yy=y+vv[k];
            if(xx>=1&&xx<=100 && yy>=1&&yy<=100 && mp[xx][yy]==mp[x][y]) return true;
        }
        return false;
    }
    int color1(char mp[101][101],bool vis[101][101],int x,int y){
        vis[x][y]=true;
        int res=1;
        rep(k,0,3){
            int xx=x+uu[k], yy=y+vv[k];
            if(xx>=1&&xx<=100 && yy>=1&&yy<=100 && vis[xx][yy]==false && mp[xx][yy]==mp[x][y]) res+=color1(mp,vis,xx,yy);
        }
        mp[x][y]=0;
        return res;
    }
    void proc1(char mp[101][101]){
        rep(j,1,10) rep2(i,9,1){
            int g=i,h=j;
            while(g+1<=10 && mp[g+1][h]==0) ++g;
            mp[g][h]=mp[i][j];
            if(g!=i) mp[i][j]=0;
        }
        rep(j,2,10){
            if(mp[10][j]==0) continue;
            int k;
            for(k=j-1;k>=1;--k) if(mp[10][k]!=0) break;
            if(k+1<j){
                rep(i,1,10){
                    mp[i][k+1]=mp[i][j];
                    mp[i][j]=0;
                }
            }
        }
    }
    
    void print(){
        char ms[101][101];
        bool vs[101][101]; mem(vs,false);
        rep(i,1,10) rep(j,1,10) ms[i][j]=FIRST[i][j];
        rep(i,1,10){
            rep(j,1,10)
                if(Ans[1].x==i&&Ans[1].y==j)
                    printf("#");
                else{
                    if(ms[i][j]==0)
                        printf(" ");
                    else
                        printf("%d",ms[i][j]);
                }
            cout<<endl;
        }
        rep(i,1,STEP){
            printf("step%d = (%d,%d)
    ",i,Ans[i].x,Ans[i].y); cout<<endl<<endl;
            color1(ms,vs,Ans[i].x,Ans[i].y);
            proc1(ms);
            if(i!=STEP){
                rep(k,1,10){
                    rep(j,1,10)
                        if(Ans[i+1].x==k&&Ans[i+1].y==j)
                            printf("#");
                        else{
                            if(ms[k][j]==0)
                                printf(" ");
                            else
                                printf("%d",ms[k][j]);
                        }
                    cout<<endl;
                }
            }
        }
    }
    
    //mp[][]:current state   step:current step   score:current score
    void dfs(char mp[101][101],bool vis[101][101],int tx,int ty,int step,int score){ 
        //printf("step=%d    score=%d    click on (%d,%d) of last image.
    ",step,score,tx,ty);
        /*rep(i,1,10){
            rep(j,1,10) if(mp[i][j]!=0) printf("%d ",mp[i][j]); else printf("  ");
            cout<<endl;
        }*/
        tempAns[step].x=tx;
        tempAns[step].y=ty;
        rep(i,1,10) rep(j,1,10){
            if(mp[i][j]==0) continue; //这个位置是空的,跳过
            if(vis[i][j]) continue; //计算过,跳过
            if(check(mp,i,j)==false){ //点击这个位置没法消去块
                vis[i][j]=true;
                continue;
            }
            char temp_mp[101][101];
            bool temp_vis[101][101]; mem(temp_vis,false);
            rep(i1,1,10) rep(j1,1,10) temp_mp[i1][j1]=mp[i1][j1];
            int ts=color1(temp_mp,vis,i,j);
            proc1(temp_mp);
            dfs(temp_mp,temp_vis,i,j,step+1,score+5*ts*ts);
        }
        if(score>bestScore){
            STEP=step;
            rep(i,0,step) Ans[i]=tempAns[i];
            bestScore=score;
            cout<<"bestScore = "<<bestScore<<endl;
            //print();
            rep(i,1,step) printf("step%d = (%d,%d)
    ",i,Ans[i].x,Ans[i].y); cout<<endl<<endl;
        }
    }
    
    
    
    void read(){
        rep(i,0,10) rep(j,0,10) FIRST[i][j]=-1;
        freopen("c:\hello.in","r",stdin);
        rep(i,1,10) rep(j,1,10) scanf("%d",&FIRST[i][j]);
        fclose(stdin);
    }
    void init(){
        bestScore=0;
        mem(VIS,false);
    }
    int main(){
        read();
        init();
        dfs(FIRST,VIS,-1,-1,0,0);
    }
  • 相关阅读:
    使用WCF实现消息推送
    T31P电子秤数据读取
    持续性任务代码的一些测试
    XP+Android手机DIY家庭视频点播系统-历时3周全力打造吊丝的幸福生活
    Android 上传文件到XP
    Android ListView的一个坑,你可掉进去过?
    无脑无负担网站架构-- Application Request Route的一些应用
    Android 一些注意
    懒人的ERP开发框架--2B&苦B程序员专用
    PHP Token(令牌)设计应用
  • 原文地址:https://www.cnblogs.com/fish7/p/4068750.html
Copyright © 2011-2022 走看看