hdu1010
2015-07-29 17:13
316 查看
深搜+剪纸
#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <iterator>
#include <cstring>
#include <cmath>
using namespace std;
char maze[10][10];
int flag, n, m, t;
int visit[10][10];
int dx[] = {-1,1,0,0}, dy[] = {0,0,-1,1};
int bx, by, ex, ey;
int isvalid(int x, int y) {
return x >=0 && x <n && y >=0 && y <m && !visit[x][y] && maze[x][y] != 'X';
}
void dfs(int x, int y, int time) // position (x,y) at time point(time)
{
if (flag) {return;}
if (time==t) if (x==ex && y==ey) {flag = 1; return;}
if (time>=t) {return;}
int dis = abs(x-ex) + abs(y-ey);
if (dis+time > t || (dis%2 != (t-time)%2)) {return;}
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (isvalid(nx,ny)) {
visit[nx][ny] = 1;
dfs(nx,ny,time+1);
visit[nx][ny] = 0;
}
}
}
int main() {
while (cin >> n >> m >> t && (n||m||t)) {
int mt = 1;
for (int i = 0; i < n; i++)
{
flag = 0;
memset(visit, 0, sizeof(visit));
cin >> maze[i];
for (int j = 0; j < m; j++) {
if (maze[i][j] == 'S') bx = i, by = j;
if (maze[i][j] == 'D') ex = i, ey = j;
if (maze[i][j] == '.') mt++;
}
}
if (mt < t) {cout << "NO" << endl; continue;}
mt = abs(bx-ex) + abs(by-ey);
if (mt%2 != t%2) {cout << "NO" << endl; continue;}
visit[bx][by] = 1;
dfs(bx, by, 0);
if (flag) {cout << "YES" << endl;}
else {cout << "NO" << endl;}
}
return 0;
}
#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <iterator>
#include <cstring>
#include <cmath>
using namespace std;
char maze[10][10];
int flag, n, m, t;
int visit[10][10];
int dx[] = {-1,1,0,0}, dy[] = {0,0,-1,1};
int bx, by, ex, ey;
int isvalid(int x, int y) {
return x >=0 && x <n && y >=0 && y <m && !visit[x][y] && maze[x][y] != 'X';
}
void dfs(int x, int y, int time) // position (x,y) at time point(time)
{
if (flag) {return;}
if (time==t) if (x==ex && y==ey) {flag = 1; return;}
if (time>=t) {return;}
int dis = abs(x-ex) + abs(y-ey);
if (dis+time > t || (dis%2 != (t-time)%2)) {return;}
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (isvalid(nx,ny)) {
visit[nx][ny] = 1;
dfs(nx,ny,time+1);
visit[nx][ny] = 0;
}
}
}
int main() {
while (cin >> n >> m >> t && (n||m||t)) {
int mt = 1;
for (int i = 0; i < n; i++)
{
flag = 0;
memset(visit, 0, sizeof(visit));
cin >> maze[i];
for (int j = 0; j < m; j++) {
if (maze[i][j] == 'S') bx = i, by = j;
if (maze[i][j] == 'D') ex = i, ey = j;
if (maze[i][j] == '.') mt++;
}
}
if (mt < t) {cout << "NO" << endl; continue;}
mt = abs(bx-ex) + abs(by-ey);
if (mt%2 != t%2) {cout << "NO" << endl; continue;}
visit[bx][by] = 1;
dfs(bx, by, 0);
if (flag) {cout << "YES" << endl;}
else {cout << "NO" << endl;}
}
return 0;
}
相关文章推荐
- 一些教程资料
- storm编程指南
- 打印金字塔
- Mac10.10 terminal web开发环境配置之Apache详细小结
- myclipse web项目 eclipse中不能运行
- mongoDB collection name包含特殊字符处理方法
- 维特比算法基础
- sybase备份恢复
- hdu 4908
- 【ZOJ】3881 From the ABC conjecture【暴力容斥】
- 纯PHP实现定时器任务(Timer)
- 关闭HTML5只能提示(form上新增novalidate)
- Selenium运行环境搭建(Java)
- 打印水仙花
- 使用 Rails 的 custom configuration 来配置 Redis
- Android MVP开发。
- sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询
- 对不同的状态搜索
- C++基础:动态链接库调用方法总结
- FPGA开发