hdu1010(深搜 剪枝 回溯)

来源:互联网 发布:java方法的定义和调用 编辑:程序博客网 时间:2024/05/08 18:42
这个题目我做的时候不是超时就是错误,自己是新手也一直不知道再怎么剪下去 就参考了网上一大牛blog
代码如下
#include<stdio.h>#include<stdlib.h>#include<string.h> //hdu1010 深搜优化剪枝 int m,n,t;char map[8][8];int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};int ex,ey,sx,sy,ok;void dfs(int x,int y,int count){   int i;   if(count==t)   {   if(ex==x&&ey==y) ok=1;   return;   }   if(ok) return;//只要找到一条路径 那么就行了   int temp=abs(x-ex)+abs(y-ey)-abs(count-t);//剪枝的地方 判断为奇数或者偶数   if(temp>0||temp&1) return;//如过是奇数 或者当要走的路大于应该走的步数的时候,return;   for(int i=0;i<4;i++)   {   int fx=x+dir[i][0];   int fy=y+dir[i][1];   if(fx>=0&&fx<n&&fy>=0&&fy<m&&map[fx][fy]!='X')   {   map[fx][fy]='X';   dfs(fx,fy,count+1);   map[fx][fy]='.';//回溯 对于新手来说可以想一想程序运行框架}   }}int main(){int i,j,wall;while(scanf("%d%d%d",&n,&m,&t)!=EOF&&(n||m||t)){wall=0;for(int i=0;i<n;i++){scanf("%s",map[i]);//最好用scanf gets容易出问题for(int j=0;j<m;j++){if(map[i][j]=='S'){sx=i;sy=j;}else if(map[i][j]=='D'){ex=i;ey=j;}else if(map[i][j]=='X')wall++;}}if(m*n-wall<=t) printf("NO\n");else{ok=0;map[sx][sy]='X';dfs(sx,sy,0);if(ok) printf("YES\n");else printf("NO\n"); }}return 0;}

0 0
原创粉丝点击