FZU 2186 小明的迷宫 (TSP)

题意给出一个迷宫,然后拿到所有宝藏然后回到原点,求最短时间。

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define B(x) (1<<(x))
typedef long long ll;
void cmax(int& a,int b){ if(b>a)a=b; }
void cmin(int& a,int b){ if(b=0)
            cmin(dis[a][b],step[now.x][now.y]);
        for(int i=0;i<4;i++){
            next.x=now.x+d[i][0];
            next.y=now.y+d[i][1];
            if(next.x>=1&&next.x<=n&&next.y>=1&&next.y<=m){
                if(maze[next.x][next.y]>=0&&!mark[next.x][next.y]){
                    if(step[next.x][next.y]>step[now.x][now.y]+1){
                        step[next.x][next.y]=step[now.x][now.y]+1;
                        mark[next.x][next.y]=1;
                        q[r++]=next;
                    }
                }
            }
        }
    }
}

void Input(){
    memset(dp,0x3f,sizeof dp);
    memset(dis,0x3f,sizeof dis);
    cnt=0;
    node[cnt]=Node(1,1);
    id[1][1]=cnt++;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            scanf("%d",&maze[i][j]);
            if(i==1&&j==1)continue;
            if(maze[i][j]>0){
                id[i][j]=cnt;
                node[cnt]=Node(i,j);
                cnt++;
            }
            else id[i][j]=-1;
        }
}

void DP(){
    for(int i=0;i


你可能感兴趣的:(动态规划,动态规划—状压dp)