Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1076 Accepted Submission(s): 270
5 5 GDDSS SSSFS SYGYS SGSYS SSYSS 0 0
4
//2043 power721 HDU 3681 Accepted 17252 KB 515 ms G++ 3070 B 2011-09-09 10:27:34 #include<cstdio> #include<cstring> #include<queue> #define N 3000005 using namespace std; int n,m,cnt,cnt1,num,sx,sy,state; int f[15][15][13785],hash[15][15],dir[4][2]={0,1,0,-1,1,0,-1,0}; char map[16][16]; bool ff[15][15]; void dfs(int x,int y) { int i,xx,yy; ff[x][y]=1; if(map[x][y]=='Y') num++; for(i=0;i<4;i++) { xx=x+dir[i][0]; yy=y+dir[i][1]; if(xx>=0&&yy>=0&&xx<n&&yy<m&&map[xx][yy]!='D'&&!ff[xx][yy]) dfs(xx,yy); } } struct node { int x,y,e,s,n; node(){} node(int xx,int yy,int ee,int ss,int nn=0){x=xx;y=yy;e=ee;s=ss;n=nn;} }t,ad,q[N]; int bfs() { for(int i=0;i<n;i++) for(int j=0;j<m;j++) for(int k=0;k<1<<cnt;k++) f[i][j][k]=0; int i,xx,yy,s,nn,head=0,tail=0; t=node(sx,sy,0,0,0); q[++tail]=t; f[sx][sy][0]=0; while(head!=tail) { t=q[head=(head+1)%N]; for(i=0;i<4;i++) { s=t.s; nn=t.n; xx=t.x+dir[i][0]; yy=t.y+dir[i][1]; if(xx>=0&&yy>=0&&xx<n&&yy<m&&map[xx][yy]!='D') { if(map[xx][yy]=='Y') { s|=1<<hash[xx][yy]; nn=max(nn,t.e+1); } if((s&state)==state) return nn; if(!f[xx][yy][s]) { f[xx][yy][s]=t.e+1; ad=node(xx,yy,t.e+1,s); q[tail=(tail+1)%N]=ad; } if(map[xx][yy]=='G'&&(s&1<<hash[xx][yy])==0) { s|=1<<hash[xx][yy]; if(!f[xx][yy][s]) { f[xx][yy][s]=0; ad=node(xx,yy,0,s); q[tail=(tail+1)%N]=ad; } } } } } return 0; } int bfs(int mid) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) for(int k=0;k<1<<cnt;k++) f[i][j][k]=0; int i,xx,yy,s,head=0,tail=0; t=node(sx,sy,mid,0); q[++tail]=t; f[sx][sy][0]=mid; while(head!=tail) { t=q[head=(head+1)%N]; for(i=0;i<4;i++) { s=t.s; xx=t.x+dir[i][0]; yy=t.y+dir[i][1]; if(xx>=0&&yy>=0&&xx<n&&yy<m&&map[xx][yy]!='D') { if(map[xx][yy]=='Y') s|=1<<hash[xx][yy]; if((s&state)==state) return 1; if(f[xx][yy][s]<t.e-1) { f[xx][yy][s]=t.e-1; ad=node(xx,yy,t.e-1,s); q[tail=(tail+1)%N]=ad; } if(map[xx][yy]=='G'&&(s&1<<hash[xx][yy])==0) { s|=1<<hash[xx][yy]; if(f[xx][yy][s]<mid) { f[xx][yy][s]=mid; ad=node(xx,yy,mid,s); q[tail=(tail+1)%N]=ad; } } } } } return 0; } int main() { while(scanf("%d%d",&n,&m),n||m) { int i,j; state=cnt=cnt1=num=0; for(i=0;i<n;i++) { scanf("%s",map[i]); for(j=0;j<m;j++) { if(map[i][j]=='Y') { state|=1<<cnt; hash[i][j]=cnt++; cnt1++; } if(map[i][j]=='G') hash[i][j]=cnt++; if(map[i][j]=='F') { sx=i; sy=j; } } } if(!state) { puts("0"); continue; } memset(ff,0,sizeof(ff)); dfs(sx,sy); if(num!=cnt1) { puts("-1"); continue; } int l=0,r=bfs(),mid,ans=-1; while(l<=r) { mid=(l+r)/2; if(bfs(mid)) { ans=mid; r=mid-1; } else l=mid+1; } printf("%d\n",ans); } }
//2030 power721 HDU 3681 Accepted 18792 KB 1515 ms C++ 1738 B 2011-09-09 10:05:26 #include<cstdio> #include<cstring> #include<queue> #define N 3000005 using namespace std; int n,m,cnt,sx,sy,state; int f[15][15][13785],hash[15][15],dir[4][2]={0,1,0,-1,1,0,-1,0}; char map[25][25]; struct node { int x,y,e,s; node(){} node(int xx,int yy,int ee,int ss){x=xx;y=yy;e=ee;s=ss;} }t,ad,q[N]; int bfs(int mid) { memset(f,0,sizeof(f)); int i,xx,yy,s,head=0,tail=0; t=node(sx,sy,mid,0); q[++tail]=t; f[sx][sy][0]=mid; while(head!=tail) { t=q[head=(head+1)%N]; for(i=0;i<4;i++) { s=t.s; xx=t.x+dir[i][0]; yy=t.y+dir[i][1]; if(xx>=0&&yy>=0&&xx<n&&yy<m&&map[xx][yy]!='D') { if(map[xx][yy]=='Y') s|=1<<hash[xx][yy]; if((s&state)==state) return 1; if(f[xx][yy][s]<t.e-1) { f[xx][yy][s]=t.e-1; ad=node(xx,yy,t.e-1,s); q[tail=(tail+1)%N]=ad; } if(map[xx][yy]=='G'&&(s&1<<hash[xx][yy])==0) { s|=1<<hash[xx][yy]; if(f[xx][yy][s]<mid) { f[xx][yy][s]=mid; ad=node(xx,yy,mid,s); q[tail=(tail+1)%N]=ad; } } } } } return 0; } int main() { while(scanf("%d%d",&n,&m),n||m) { int i,j; state=cnt=0; memset(hash,-1,sizeof(hash)); for(i=0;i<n;i++) { scanf("%s",map[i]); for(j=0;j<m;j++) { if(map[i][j]=='Y') { state|=1<<cnt; hash[i][j]=cnt++; } if(map[i][j]=='G') hash[i][j]=cnt++; if(map[i][j]=='F') { sx=i; sy=j; } } } if(!state) { puts("0"); continue; } int l=0,r=n*m,mid,ans=-1; while(l<=r) { mid=(l+r)/2; if(bfs(mid)) { ans=mid; r=mid-1; } else l=mid+1; } printf("%d\n",ans); } }