用s标记状态,bfs一下就行了
我怕忘记就几下来了
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int n,m,k,a[110][110];
int dp[110][110][32];
char g[110][110];
int dx[110],dy[110];
int ax,ay;
struct node
{
int x,y,s;
node(int w,int e,int r)
{
x=w;
y=e;
s=r;
}
};
int move[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int bfs()
{
int i,j,s,nx,ny;
queue<node>q;
s=0;
for(i=0;i<k;i++)
{
if(dx[i]==ax&&dy[i]==ay)
s=s|(1<<i);
}
q.push(node(ax,ay,s));
memset(dp,-1,sizeof(dp));
dp[ax][ay][s]=0;
while(!q.empty())
{
node tmp=q.front();
q.pop();
if(tmp.s==((1<<k)-1))
return dp[tmp.x][tmp.y][tmp.s];
for(i=0;i<4;i++)
{
nx=tmp.x+move[i][0];
ny=tmp.y+move[i][1];
s=tmp.s;
if(nx<0||nx>=n||ny<0||ny>=m)
continue;
if(a[nx][ny]==-2)
continue;
for(j=0;j<k;j++)
{
if(dx[j]==nx&&dy[j]==ny)
s|=(1<<j);
}
if(dp[nx][ny][s]!=-1)
continue;
dp[nx][ny][s]=dp[tmp.x][tmp.y][tmp.s]+1;
q.push(node(nx,ny,s));
}
}
return -1;
}
int main()
{
int i,j,x,y;
while(scanf("%d%d",&n,&m),n||m)
{
for(i=0;i<n;i++)
scanf("%s",g[i]);
memset(a,-1,sizeof(a));
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(g[i][j]=='@')
{
ax=i;
ay=j;
}
if(g[i][j]=='#')
{
a[i][j]=-2;
}
}
scanf("%d",&k);
for(i=0;i<k;i++)
{
scanf("%d%d",&x,&y);
x--;
y--;
dx[i]=x;
dy[i]=y;
}
printf("%d\n",bfs());
}
return 0;
}