hdu 1010 搜索(dfs+剪枝)

来源:互联网 发布:红辣椒电影数据分析 编辑:程序博客网 时间:2024/04/27 04:20

最近在练习搜索,可能自己的算法太渣了,所以这个题如果不剪枝就超时,剪枝了也要600MS


关于此题的剪枝,看了很多题解,觉得这个题解是讲的最清楚的——》点击打开


至于思路是:

1.奇偶剪枝

2.step超限的话,直接忽略之后的路径。


代码如下:

#include<iostream>#include<cstdio>using namespace std;#define MAXN 7int n, m,t,rec[MAXN][MAXN],vis[MAXN][MAXN],mark,ssmark;void dfs(int si, int sj, int step){if (step>t || si < 0 || si >= n || sj < 0 || sj >= m || vis[si][sj] == 1){mark = 1;return;}vis[si][sj] = 1;if (step == t && rec[si][sj] == -3){ssmark = 1;cout << "YES" << endl;return;}else if (step == t || rec[si][sj] == -1){return;}if (ssmark == 1){return;}dfs(si + 1, sj, step + 1);if (mark != 1){vis[si+1][sj] = 0;}mark = 0;dfs(si, sj+1, step + 1);if (mark != 1){vis[si][sj+1] = 0;}mark = 0;dfs(si - 1, sj, step + 1);if (mark != 1){vis[si-1][sj] = 0;}mark = 0;dfs(si, sj - 1, step + 1);if (mark != 1){vis[si][sj -1] = 0;}mark = 0;}int main(){//freopen("TestDate.txt", "r", stdin);int i, j,si,sj,ei,ej;char node;while (cin >> n >> m >> t&&(n!=0&&m!=0&&t!=0)){for (i = 0; i < n; i++)for (j = 0; j < m; j++){cin >> node;if (node == '.'){rec[i][j] = 1;continue;}else if (node == 'X'){rec[i][j] = -1;continue;}else if (node == 'S'){rec[i][j] = -2;si = i;sj = j;continue;}else if (node == 'D'){ei = i;ej = j;rec[i][j] = -3;continue;}}memset(vis, 0, sizeof(vis));ssmark = 0;mark = 0;if ((abs(ei - si) + abs(ej - sj) - t) & 1){printf("NO\n");continue;}dfs(si, sj, 0);if (ssmark == 0){cout << "NO" << endl;}}return 0;}


0 0
原创粉丝点击