杭电1010
来源:互联网 发布:淘宝怎么开发票 编辑:程序博客网 时间:2024/05/17 03:51
上链接:杭电1010
题目大意:
输入一个n*m的地图,有可以走的和不能走的石头,看t步能不能走到出口
思路:
一个深搜,不过第一次没过,后来排除特殊情况,并且进行了剪枝,就过了
贴代码:
#include <cstdio>#include <iostream>#include <cmath>using namespace std;bool flag;int n, m, t;int sx, sy, fx, fy, Xnum;char map[7][7];void dfs(int x, int y, int time){ if(x==fx && y==fy && time==t) { flag = true; return ; } int c = (t-time)-abs(x-fx)-abs(y-fy); if(c<0 || c%2==1) { flag = false; return ; } if(x-1>=0 && map[x-1][y]!='X') { map[x-1][y] = 'X'; dfs(x-1, y, time+1); map[x-1][y] = '.'; } if(flag) return ; if(x+1<n && map[x+1][y]!='X') { map[x+1][y] = 'X'; dfs(x+1, y, time+1); map[x+1][y] = '.'; } if(flag) return ; if(y-1>=0 && map[x][y-1]!='X') { map[x][y-1] = 'X'; dfs(x, y-1, time+1); map[x][y-1] = '.'; } if(flag) return ; if(y+1<m && map[x][y+1]!='X') { map[x][y+1] = 'X'; dfs(x, y+1, time+1); map[x][y+1] = '.'; } if(flag) return ;}int main(){ while(cin>>n>>m>>t && !(n==0 && m==0 && t==0)) { flag = false; Xnum = 0; for(int i=0; i<n; ++i) { for(int j=0; j<m; ++j) { cin>>map[i][j]; if(map[i][j] == 'S') { sx = i; sy = j; map[i][j] = 'X'; } else if(map[i][j] == 'D') { fx = i; fy = j; } else if(map[i][j] == 'X') ++Xnum; } } if(n*m-Xnum>=t) dfs(sx, sy, 0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0;}
注意事项:
这个题容易超时,需要进行剪枝工作:
19行处需要进行奇偶剪枝,因为当剩余步数为奇数的时候将会不符合条件
0 0
- 杭电acm 1010
- 杭电ACM-1010
- 杭电1010
- 杭电 1010
- 杭电1010题
- 杭电1010
- 杭电1010
- 杭电1010
- 杭电 1010
- 杭电1010
- 杭电1010
- 杭电 1010
- 杭电1010
- 杭电oj 1010
- 杭电1010题
- 杭电1010
- 杭电 1006 1007 1010
- 杭电1010-奇偶剪枝
- Trapping Rain Water
- Failure [INSTALL_FAILED_OLDER_SDK]解决办法
- *很不错*朴素贝叶斯分类器的应用
- GRE写作必备句型
- C# WPF button样式清空以及关闭 最小化 按钮重置
- 杭电1010
- iOS开发多线程篇—线程安全
- (转)主成分分析(Principal components analysis)-最大方差解释及
- Xcode 6 关于 iOS App 国际化问题
- HDOJ 排序(用5分隔)
- Online Judge System For SzNOI 题库 语法百题 c++ d018
- hession开发遇到的问题 Server returned HTTP response code: 500 for URL:
- PHP 中运用 elasticsearch
- 在 python 使用socket 获取 IP