1. 程式人生 > >uva10944 狀態壓縮bfs or DP

uva10944 狀態壓縮bfs or DP

space node clu while nod con puts fin int

技術分享

又是一道狀壓搜索,題解有的是狀壓DP做的目前不會日後補

寫好了以後一直蜜汁WA,看別人代碼把判斷再次回到原點的語句寫在了Q.pop()之後而不是for裏,對我也是一種啟發吧這樣寫確實有好處比如起點就是答案的情況也能處理,很方便,我i改過之後就A了。



#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f;
bool vis[22][22][(1<<16)+1];
char e[22][22];
int nut[22][22];
int N,M,Count,ans;
int fx[8][2]={1,0,-1,0,0,1,0,-1,1,-1,1,1,-1,1,-1,-1};
struct node
{
int x,y,hal,bs;
node(){}
node(int x,int y,int hal,int bs):x(x),y(y),hal(hal),bs(bs){}
};
void bfs(int sx,int sy)
{
memset(vis,0,sizeof(vis));
queue<node>Q;
node t1(sx,sy,0,0),t2;
Q.push(t1);
vis[sx][sy][0]=1;
while(!Q.empty()){
t1=Q.front(); Q.pop();
if(e[t1.x][t1.y]==‘L‘&&t1.hal==ans) {cout<<t1.bs<<endl;return;}
for(int i=0;i<8;++i){
t2.x=t1.x+fx[i][0];
t2.y=t1.y+fx[i][1];
t2.bs=t1.bs+1;
t2.hal=t1.hal;
if(t2.x>0&&t2.y>0&&e[t2.x][t2.y]==‘#‘) t2.hal=(t2.hal|(1<<nut[t2.x][t2.y]));
if(t2.x<1||t2.y<1||t2.x>N||t2.y>M||vis[t2.x][t2.y][t2.hal]) continue;
vis[t2.x][t2.y][t2.hal]=1;
Q.push(t2);
}
}
}
int main()
{
int i,j,k;
while(scanf("%d%d",&N,&M)!=EOF){Count=0;
int sx,sy;
memset(e,0,sizeof(e));
memset(nut,-1,sizeof(nut));
for(i=1;i<=N;++i)
for(j=1;j<=M;++j){
scanf(" %c",&e[i][j]);
if(e[i][j]==‘L‘) {sx=i;sy=j;}
else if (e[i][j]==‘#‘){
nut[i][j]=Count++;
}
}
if(Count==0) {puts("0");continue;}
ans=(1<<Count)-1;
bfs(sx,sy);
}
return 0;
}


/*
5 5
L....
#....
#....
.....
#....
*/

uva10944 狀態壓縮bfs or DP