当前位置:编程学习 > C/C++ >>

HDU 4090 GemAnd Prince (DFS+BFS)/(DFS+DFS)

题意:相信大家都玩过消消看,连在一起大于等于3个相同的颜色就可以消去了,这道题目还加了另外的一个条件,每次消完了之后都会下落然后左移,问你最多能得多少分。
 
题解:开始的时候我的第一想法是BFS+DFS,然后果、果断MLE,最后看了别人的代码,基本上是DFS+DFS或者DFS+BFS,哎,为什么我的思维就是与众不同呢
 
 
先来个错误代码
 
BFS+DFS:(开大了MLE,开小了WA)
 
 
#include <iostream>  
#include <cstdio>  
#include <cstdlib>  
#include <cmath>  
#include <cstring>  
#include <string>  
#include <vector>  
#include <list>  
#include <deque>  
#include <queue>  
#include <iterator>  
#include <stack>  
#include <map>  
#include <set>  
#include <algorithm>  
#include <cctype>  
using namespace std;  
  
typedef long long LL;  
const int N=2005;  
const int M=555555;  
const LL II=100000000;  
const int INF=0x3f3f3f3f;  
const double PI=acos(-1.0);  
  
int n,m,k;  
int Max;  
int cnt;  
bool vis[10][10];  
int t[8][2]={-1,-1, -1,0, -1,1, 0,-1, 0,1, 1,-1, 1,0, 1,1};  
int xiao[10][10];  
int leixing;  
struct xh  
{  
    int value;  
    short int s[8][8];  
}w,e,q[M];  
  
void prin()  
{  
    cout<<"************"<<endl;  
    for(int i=0;i<n;i++)  
    {  
        for(int j=0;j<m;j++)  
            cout<<w.s[i][j]<<" ";  
        cout<<endl;  
    }  
    cout<<"************"<<endl;  
}  
  
void dfs(int i,int j)  
{  
    for(int k=0;k<8;k++)  
    {  
        int x=i+t[k][0];  
        int y=j+t[k][1];  
        if(x<0||x>=n||y<0||y>=m)    continue;  
        if(vis[x][y]||w.s[x][y]!=leixing)   continue;  
        vis[x][y]=1;  
        w.s[x][y]=0;  
        cnt++;  
        dfs(x,y);  
    }  
}  
  
void yidong()  
{  
    int i,j;  
    for(i=0;i<m;i++)  
    {  
        int k=n-1;  
        for(j=n-1;j>=0;j--)  
        {  
            if(w.s[j][i]!=0)  
            {  
                w.s[k][i]=w.s[j][i];  
                if(k!=j)  w.s[j][i]=0;  
                k--;  
            }  
        }  
    }  
    int k=0;  
    for(j=0;j<m;j++)  
    {  
        if(w.s[n-1][j]!=0)  
        {  
            if(j!=k)  
            {  
                for(i=0;i<n;i++)  
                    w.s[i][k]=w.s[i][j],w.s[i][j]=0;  
            }  
  
            k++;  
        }  
    }  
}  
  
void prine()  
{  
    cout<<"************"<<endl;  
    for(int i=0;i<n;i++)  
    {  
        for(int j=0;j<m;j++)  
            cout<<e.s[i][j]<<" ";  
        cout<<endl;  
    }  
    cout<<"************"<<endl;  
}  
  
int maxscore()  
{  
    int sum=0,i,j;  
    int ll[8]={0};  
    for(i=0;i<n;i++)  
        for(j=0;j<m;j++)  
            ll[e.s[i][j]]++;  
    for(i=1;i<=k;i++)  
        if(ll[i]>=3)  
            sum+=ll[i]*ll[i];  
    return sum;  
}  
  
void BFS()  
{  
    int he=0,ta=0;  
    int i,j;  
    w.value=0;  
    q[ta++]=w;  
    while(he!=ta)  
    {  
        e=q[he++];  
        if(he==M)  
            he=0;  
        if((maxscore()+e.value)<=Max)  
            continue;  
        memset(vis,0,sizeof(vis));  
        for(i=0;i<n;i++)  
        {  
            for(j=0;j<m;j++)  
            {  
                w=e;  
                if(vis[i][j]||w.s[i][j]==0)   continue;  
                leixing=w.s[i][j];  
                w.s[i][j]=0;  
                vis[i][j]=1;  
                cnt=1;  
                dfs(i,j);  
                if(cnt<3)   continue;  
                //prin();  
                yidong();//prin(); system("pause");  
                w.value+=cnt*cnt;  
                if(Max<w.value)  
                    Max=w.value;  
                q[ta++]=w;  
                if(ta==M)  
                    ta=0;  
            }  
        }  
    }  
  
}  
  
int main()  
{  
    while(~scanf("%d%d%d",&n,&m,&k))  
    {  
        int i,j;  
        for(i=0;i<n;i++)  
            for(j=0;j<m;j++)  
                scanf("%d",&w.s[i][j]);  
        Max=0;  
        BFS();  
        cout<<Max<<endl;  
    }  
    return 0;  
}  

 

 
AC代码:(DFS+DFS)
 
 
#include <iostream>  
#include <cstdio>  
#include <cstdlib>  
#include <cmath>  
#include <cstring>  
#include <string>  
#include <vector>  
#include <list>  
#include <deque>  
#include <queue>  
#include <iterator>  
#include <stack>  
#include <map>  
#include <set>  
#include <algorithm>  
#include <cctype>  
using namespace std;  
  
typedef long long LL;  
const int N=2005;  
const int M=555555;  
const LL II=100000000;  
const int INF=0x3f3f3f3f;  
const double PI=acos(-1.0);  
  
int n,m,k;  
int Max,cnt;  
int w[8][8];  
int t[8][2]={-1,-1, -1,0, -1,1, 0,-1, 0,1, 1,-1, 1,0, 1,1};  
int leixing;  
  
inline int maxscore()  
{  
    int sum=0,i,j;  
    int ll[8];  
    memset(ll,0,sizeof(ll));  
    for(i=0;i<n;i++)  
        for(j=0;j<m;j++)  
            ll[w[i][j]]++;  
    for(i=1;i<=k;i++)  
        if(ll[i]>=3)  
            sum+=ll[i]*ll[i];  
    return sum;  
}  
  
inline void yidong()  
{  
    int i,j;  
    for(i=0;i<m;i++)  
    {  
        int k=n-1;  
        for(j=n-1;j>=0;j--)  
        {  
            if(w[j][i]!=0)  
            {  
                w[k][i]=w[j][i];  
                if(k!=j)  w[j][i]=0;  
                k--;  
            }  
        }  
    }  
    int k=0;  
    for(j=0;j<m;j++)  
    {  
        if(w[n-1][j]!=0)  
        {  
            if(j!=k)  
            {  
                for(i=0;i<n;i++)  
                    w[i][k]=w[i][j],w[i][j]=0;  
            }  
  
            k++;  
        }  
    }  
}  
  
void dfs(int i,int j,bool vis[][8])  
{  
    for(int k=0;k<8;k++)  
    {  
        int x=i+t[k][0];  
        int y=j+t[k][1];  
        if(x<0||x>=n||y<0||y>=m)    continue;  
        if(vis[x][y]||w[x][y]!=leixing)   continue;  
        vis[x][y]=1;  
        w[x][y]=0;  
        cnt++;  
        dfs(x,y,vis);  
    }  
}  
  
inline void debug(int p[][8])  
{  
    cout<<"************"<<endl;  
    for(int i=0;i<n;i++)  
    {  
        for(int j=0;j<m;j++)  
            cout<<p[i][j]<<" ";  
        cout<<endl;  
    }  
    cout<<"************"<<endl;  
}  
  
inline void save(int sa[][8])  
{  
    for(int i=0;i<n;i++)  
        for(int j=0;j<m;j++)  
            sa[i][j]=w[i][j];  
}  
  
inline void read(int sa[][8])  
{  
    for(int i=0;i<n;i++)  
        for(int j=0;j<m;j++)  
            w[i][j]=sa[i][j];  
}  
  
void DFS(int value)  
{  
    if((maxscore()+value)<=Max)//剪枝  
        return ;  
    bool vis[8][8];  
    memset(vis,0,sizeof(vis));  
    for(int i=0;i<n;i++)  
    {  
        for(int j=0;j<m;j++)  
        {  
            if(w[i][j]==0)  
                vis[i][j]=1;  
            if(vis[i][j])   continue;  
  
            int sa[8][8];  
            save(sa);//保存  
  
            leixing=w[i][j];  
            w[i][j]=0;  
            cnt=1;  vis[i][j]=1;  
            dfs(i,j,vis);  
            if(cnt<3)  {read(sa);    continue;}  
  
            yidong();  
  
            int tempv=value+cnt*cnt;  
            if(tempv>Max)   Max=tempv;  
            DFS(tempv);  
            read(sa);//读取  
        }  
    }  
}  
  
int main()  
{  
    while(~scanf("%d%d%d",&n,&m,&k))  
    {  
        int i,j;  
        for(i=0;i<n;i+
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,