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++ ,
上一个:hdu 4081 Qin Shi Huang's National Road System (最小生成树变形 两种解法 1.Prim 2.dfs)
下一个:hdu4082 Hou Yi's secret
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊