hdu - 1010 Tempter of the Bone (dfs+奇偶性剪枝) && hdu-1015 Safecracker(简单搜索)

http://acm.hdu.edu.cn/showproblem.php?pid=1010

这题就是问能不能在t时刻走到门口,不能用bfs的原因大概是可能不一定是最短路路径吧。

但是这题要过除了细心外,还需要强力的剪枝。

奇偶性剪枝:参考 http://www.cppblog.com/Geek/archive/2010/04/26/113615.html

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <cmath>
 5 using namespace std;
 6 char map[9][9];
 7 int n,m,t,di,dj;
 8 bool escape;
 9 int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
10 void dfs(int si,int sj,int cnt)
11 {
12     if(cnt>10000) return;
13     if(escape) return;
14    if(si>n||sj>m||si<=0||sj<=0) return;
15    if(cnt==t&&si==di&&sj==dj)    escape=1;
16    if(escape) return;
17    if(cnt>=t) return;
18    int i,temp;
19    temp=(t-cnt)-abs(si-di)-abs(sj-dj);
20    if(temp<0||temp&1) return;
21    for(i=0;i<4;i++){
22       if(map[si+dir[i][0]][sj+dir[i][1]]!=‘X‘)
23       {
24          map[si+dir[i][0]][sj+dir[i][1]]=‘X‘;
25          dfs(si+dir[i][0],sj+dir[i][1],cnt+1);
26          map[si+dir[i][0]][sj+dir[i][1]]=‘.‘;
27       }
28    }
29    return;
30 }
31 int main()
32 {
33     int i,j,si,sj;
34     while(cin>>n>>m>>t)
35     {
36       if(n==0&&m==0&&t==0) break;
37       int wall=0;
38       for(i=1;i<=n;i++)
39          for(j=1;j<=m;j++)
40          {
41             cin>>map[i][j];
42             if(map[i][j]==‘S‘) { si=i; sj=j; }
43             else if(map[i][j]==‘D‘) { di=i; dj=j; }
44             else if(map[i][j]==‘X‘) wall++;
45          }
46        if(n*m-wall<=t)
47        {
48            cout<<"NO"<<endl;
49            continue;
50        }
51        escape=0;
52        map[si][sj]=‘X‘;
53        dfs(si,sj,0);
54        if(escape) cout<<"YES"<<endl;
55        else cout<<"NO"<<endl;
56    }
57    return 0;
58 }

http://acm.hdu.edu.cn/showproblem.php?pid=1015

给定一个字符串和一个数n,然后再字符串中找出5个字符,满足题目中的等式并且字典序最大。

输入之后先把字符串从大到小排序,然后搜索即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 bool cmp(char a,char b)
 8 {
 9     return a>b;
10 }
11
12 int k,j,flag,vis[15];
13 char s[15],ss[6],res[6];
14
15 bool judge(int v,int w,int x,int y,int z)
16 {
17     if(v-w*w+x*x*x-y*y*y*y+z*z*z*z*z==k)
18         return 1;
19     return 0;
20 }
21
22 void dfs(int x)
23 {
24     if(flag) return;
25     int i;
26     if(x==5)
27     {
28         if(judge(ss[0]-64,ss[1]-64,ss[2]-64,ss[3]-64,ss[4]-64)) {flag=1;strcpy(res,ss);}
29         return;
30     }
31     int l=strlen(s);
32     for(i=0;i<l;i++)
33     {
34         if(!vis[i])
35         {
36             vis[i]=1;
37             ss[x]=s[i];
38             dfs(x+1);
39             vis[i]=0;
40         }
41     }
42 }
43
44 int main()
45 {
46     int i;
47     //freopen("a.txt","r",stdin);
48     while(scanf("%d %s",&k,s)!=EOF&&k!=0&&strcmp(s,"END")!=0)
49     {
50         flag=0;
51         sort(s,s+strlen(s),cmp);
52         memset(vis,0,sizeof(vis));
53         dfs(0);
54         if(flag)
55         {
56             printf("%s\n",res);
57         }
58         else printf("no solution\n");
59     }
60     return 0;
61 }
时间: 2024-10-29 19:09:43

hdu - 1010 Tempter of the Bone (dfs+奇偶性剪枝) && hdu-1015 Safecracker(简单搜索)的相关文章

hdu.1010.Tempter of the Bone(dfs+奇偶剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 82702    Accepted Submission(s): 22531 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU 1010 Tempter of the Bone (DFS 奇偶剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 75141    Accepted Submission(s): 20531 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

hdu 1010 Tempter of the Bone DFS+奇偶剪枝,入门题

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 78390    Accepted Submission(s): 21395 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU 1010 Tempter of the Bone dfs+剪枝

给你一个迷宫一个起点和一个终点,问你能否走T步刚好到达终点,不能重复走,并且只有4个方向 显然这是一个dfs,虽然N最大只有7,但是裸的dfs复杂度还是太高了,因此要进行一些剪枝 1.如果T比图上所有的可走点还要大,肯定是不可行的.这个可以避免dfs整张图. 2.奇偶剪枝,有性质当前点(x,y)到目标点(tx,ty)的所有路径的长度的奇偶性一定和|x-tx|+|y-ty|一样. #include <cstdio> #include <iostream> #include <c

HDU 1010 Tempter of the Bone(DFS剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 129289    Accepted Submission(s): 34906 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU 1010 Tempter of the Bone(深度+剪枝)

http://acm.hdu.edu.cn/showproblem.php?pid=1010 题意:就是给出了一个迷宫,小狗必须经过指定的步数到达出口,并且每个格子只能走一次. 首先先来介绍一下奇偶性剪枝: 在这道题目中,如果使用剪枝的话,可以节省不少的时间. 在这道题目中,每次dfs循环时都可以判断一下小狗当前位置与终点所相差的步数,如果不为偶数的话,说明到达不了终点,就可以退出这个循环,不必继续dfs了. 在这道题目中,由于每个格子只能经过一次,所以经过一次后,可以把该点位置改为'X',然后

HDU 1010 Tempter of the Bone(DFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意: 输入 n m t,生成 n*m 矩阵,矩阵元素由 ‘.’ 'S' 'D' 'X' 四类元素组成. S'代表是开始位置: 'D'表示结束位置:'.'表示可以走的路:'X'表示是墙. 问:从‘S’  能否在第 t 步 正好走到 'D'. 解题思路: 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,t; 4 int

HDU 1010 Tempter of the Bone DFS 简单题 注意剪枝

题意:一只小狗要刚好在t时刻从起点都到终点,问可不可以. 注意剪枝. 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 using namespace std; 5 int maze[9][9]; 6 bool vis[9][9]; 7 int n,m,t; 8 bool ans; 9 struct Point 10 { 11 int x,y; 12 }; 13 int dx[4]={0,0,-1,1}

hdu 1010 Tempter of the Bone 深搜+剪枝

题意:在一个坐标内,给定起点和终点,问能否恰好在t时刻到达终点. 以前很少写搜索题,所以看到这个题,就按照普通的深搜写了一下,交上去超时了.后来在网上搜了一下才知道,要剪枝才行.可是,我以前从没写过剪枝,不知道怎么剪,就按照别人的思路往下想.看懂以后,我对剪枝的理解是:对于一些没有必要继续搜索的路径,不再往下深搜,提前返回到上一层.花了半天时间调试代码,终于AC了. 奇偶剪枝:根据题目,doggie必须在第t秒到达门口.也就是需要走t-1步.设doggie开始的位置为(sx,sy),目标位置为(