//markdown复制进来一堆问题 还是链接方便点
首先想到用9个方格来表示一个房间,如此一来复杂许多,MLE代码如下:
//Writer:GhostCai && His Yellow Duck#include#define MAXN 50using namespace std;int m,n;int a[MAXN][MAXN];bool vis[MAXN][MAXN];void opet(int num,int x,int y){ bool up=0,dn=0,lf=0,rt=0;//!!! if(num>=8){ dn=1; num-=8; } if(num>=4){ rt=1; num-=4; } if(num>=2){ up=1; num-=2; } if(num>=1){ lf=1; } a[x*2][y*2]=2; if(up) a[x*2-1][y*2]=1,a[x*2-1][y*2+1]=1,a[x*2-1][y*2-1]=1; if(dn) a[x*2+1][y*2]=1,a[x*2+1][y*2+1]=1,a[x*2+1][y*2-1]=1; if(lf) a[x*2][y*2-1]=1,a[x*2+1][y*2-1]=1,a[x*2-1][y*2-1]=1; if(rt) a[x*2][y*2+1]=1,a[x*2+1][y*2+1]=1,a[x*2-1][y*2+1]=1; }void dfs(int x,int y){ if(vis[x][y]) return; if(x<1||x>m*2+1||y<1||y>n*2+1) return; if(a[x][y]==1) return; if(a[x][y]!=0) vis[x][y]=1;//!! if(a[x][y]==2) a[x][y]=-1; dfs(x+1,y); dfs(x-1,y); dfs(x,y+1); dfs(x,y-1);} int calc(){ int cnt=0; for(register int i=1;i<=m*2+1;i++){ for(register int j=1;j<=n*2+1;j++){ if(a[i][j]==-1){ cnt++; a[i][j]=2; } } } return cnt;}int main(){ cin>>m>>n; int i,j; int r; for(i=1;i<=m;i++){ for(j=1;j<=n;j++){ cin>>r; opet(r,i,j); } } int ans=0,mx=0,cnt=0; for(i=1;i<=m*2+1;i++) a[i][1]=1,a[i][n*2+1]=1; for(i=1;i<=n*2+1;i++) a[1][i]=1,a[m*2+1][i]=1;// for(i=1;i<=m*2+1;i++){ // for(j=1;j<=n*2+1;j++){ // cout< <<" ";// }// cout<
百般无奈下,重新思路。
想到其实没必要用9个方格,一个就挺好。 只不过在搜索的时候,利用数字判断一下这个方向走不走。注意的一点是局部变量要赋初值,dfs里四个布尔位置变量一开始没有赋初值,导致奇怪的结果。
还是很像swim,嗯。//Writer:GhostCai && His Yellow Duck#include#define MAXN 200 using namespace std;int m,n;int a[MAXN][MAXN];bool vis[MAXN][MAXN];void dfs(int x,int y){ if(vis[x][y]) return; if(x<1||x>m||y<1||y>n) return; int d=a[x][y]; vis[x][y]=1;//!! a[x][y]+=666; bool lf=0,rt=0,up=0,dn=0;//!!! if(d>=8){ d-=8; dn=1; } if(d>=4){ d-=4; rt=1; } if(d>=2){ up=1; d-=2; } if(d>=1){ lf=1; } if(!lf) dfs(x,y-1); if(!rt) dfs(x,y+1); if(!dn) dfs(x+1,y); if(!up) dfs(x-1,y);} int calc(){ int cnt=0; for(register int i=1;i<=m;i++){ for(register int j=1;j<=n;j++){ if(a[i][j]>16){ cnt++; a[i][j]-=666; } } } return cnt;}int main(){ int ans=0,mx=0,cnt=0; cin>>m>>n; int i,j; for(i=1;i<=m;i++){ for(j=1;j<=n;j++){ cin>>a[i][j]; } } for(i=1;i<=m;i++){ for(j=1;j<=n;j++){ if(!vis[i][j]){ dfs(i,j); cnt++; ans=calc(); mx=max(mx,ans); } } } cout< < < <