hdu 2128 Tempter of the Bone II

来源:互联网 发布:中文域名到期查询 编辑:程序博客网 时间:2024/05/10 23:58
#include<stdio.h>#include<string.h>int N=9999999;char a[10][10];int maxn,n,m,startx,starty,endx,endy;int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};int book[10][10][1000];void dfs(int x,int y,int num,int step){    if(x==endx&&y==endy){        if(step<maxn){maxn=step;return;}    }  for(int i=0;i<4;i++)  {     int tx=x+next[i][0],ty=y+next[i][1];     if(tx>n||tx<1||ty<1||ty>m) continue;     if(a[tx][ty]=='X'){        if(num<1) continue;        a[tx][ty]='.';        book[tx][ty][num-1]=1;        dfs(tx,ty,num-1,step+2);        a[tx][ty]='X';       book[tx][ty][num-1]=0;     }     else if(a[tx][ty]>='1'&&a[tx][ty]<='9'){        int c=num+a[tx][ty]-'0';        a[tx][ty]='.';        book[tx][ty][c]=1;        dfs(tx,ty,c,step+1);        a[tx][ty]=c-num+'0';        book[tx][ty][c]=0;     }     else{        if(book[tx][ty][num]) continue;        book[tx][ty][num]=1;        dfs(tx,ty,num,step+1);        book[tx][ty][num]=0;     }  }  return ;}int main(){ while(scanf("%d%d",&n,&m)){        if(n==0&&m==0) break;       for(int i=1;i<=n;i++){         scanf("%s",a[i]+1);        for(int j=1;j<=m;j++)          if(a[i][j]=='S'){startx=i,starty=j;}          else if(a[i][j]=='D'){endx=i,endy=j;}       }    memset(book,0,sizeof(book));    maxn=N;    dfs(startx,starty,0,0);    if(maxn==N) printf("-1\n");    else printf("%d\n",maxn);    }    return 0;}//深搜超时

0 0
原创粉丝点击