hdu 5612 Baby Ming and Matrix games
2016-01-27 14:55
316 查看
做了这题之后,我才算时真正明白前几天做hdu1175根本不能有BFS,什么扩展顺序,那都是自己骗自己而已。
因为用dfs的话,没搜索,一个点,就可以及时标记vis[i][j] = 1,如果这个点不是所需要的点时,就可以及时vis[i][j] = 0。
清楚这个后,自己对这类题,终于有所理解了。
题目连接:
http://acm.hdu.edu.cn/showproblem.php?pid=5612
解题思路:
用bfs搜索即可。注意:
虽然题目:In the next n lines, each line input m characters, indicating the matrix. (The number of numbers in the matrix is less than 15)但是必须要开
char maze[30][30];这样大的数组,开20都wrong,一开始我还以为我其他地方写错了呢。。。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
using namespace std;
const int dx[] = {-1,0,1,0},dy[] = {0,-1,0,1};
const double eps = 1e-8;
int n,m;
double sum;
char maze[30][30];
int vis[30][30];
int dfs(int x,int y,double ans){
if(fabs(ans-sum) <= eps)
return 1;
vis[x][y] = 1;
for(int i = 0; i < 4; i++){
int xx = x+2*dx[i],yy = y+2*dy[i];
if(xx < 0 || xx >= n || yy < 0 || yy >= m)
continue;
if(vis[xx][yy])
continue;
char op = maze[x+dx[i]][y+dy[i]];
int num = maze[xx][yy]-'0';
if(op == '+'){
if(dfs(xx,yy,ans+num))
return 1;
}
else if(op == '-'){
if(dfs(xx,yy,ans-num))
return 1;
}
else if(op == '*'){
if(dfs(xx,yy,ans*num))
return 1;
}
else if(op == '/' && num){
if(dfs(xx,yy,ans/num))
return 1;
}
}
vis[x][y] = 0;
return 0;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%lf",&n,&m,&sum);
for(int i = 0; i < n; i++){
scanf("%s",maze[i]);
}
int flag = 0;
for(int i = 0; i < n; i += 2){
for(int j = 0; j < m; j += 2){
memset(vis,0,sizeof(vis));
if(flag = dfs(i,j,maze[i][j]-'0'))
break;
}
if(flag)
break;
}
if(flag)
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}
因为用dfs的话,没搜索,一个点,就可以及时标记vis[i][j] = 1,如果这个点不是所需要的点时,就可以及时vis[i][j] = 0。
清楚这个后,自己对这类题,终于有所理解了。
题目连接:
http://acm.hdu.edu.cn/showproblem.php?pid=5612
解题思路:
用bfs搜索即可。注意:
虽然题目:In the next n lines, each line input m characters, indicating the matrix. (The number of numbers in the matrix is less than 15)但是必须要开
char maze[30][30];这样大的数组,开20都wrong,一开始我还以为我其他地方写错了呢。。。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
using namespace std;
const int dx[] = {-1,0,1,0},dy[] = {0,-1,0,1};
const double eps = 1e-8;
int n,m;
double sum;
char maze[30][30];
int vis[30][30];
int dfs(int x,int y,double ans){
if(fabs(ans-sum) <= eps)
return 1;
vis[x][y] = 1;
for(int i = 0; i < 4; i++){
int xx = x+2*dx[i],yy = y+2*dy[i];
if(xx < 0 || xx >= n || yy < 0 || yy >= m)
continue;
if(vis[xx][yy])
continue;
char op = maze[x+dx[i]][y+dy[i]];
int num = maze[xx][yy]-'0';
if(op == '+'){
if(dfs(xx,yy,ans+num))
return 1;
}
else if(op == '-'){
if(dfs(xx,yy,ans-num))
return 1;
}
else if(op == '*'){
if(dfs(xx,yy,ans*num))
return 1;
}
else if(op == '/' && num){
if(dfs(xx,yy,ans/num))
return 1;
}
}
vis[x][y] = 0;
return 0;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%lf",&n,&m,&sum);
for(int i = 0; i < n; i++){
scanf("%s",maze[i]);
}
int flag = 0;
for(int i = 0; i < n; i += 2){
for(int j = 0; j < m; j += 2){
memset(vis,0,sizeof(vis));
if(flag = dfs(i,j,maze[i][j]-'0'))
break;
}
if(flag)
break;
}
if(flag)
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}
相关文章推荐
- 跟我一起学习VIM - The Life Changing Editor
- 安卓wifi管理操作帮助类
- Hbase shell
- Android Handler Looper Message 详细分析
- 集训队专题(1)1006 单词数
- cmd命令行指定系统延迟关机时间
- phpQuery—基于jQuery的PHP实现
- servlet中Get&Post方法的比较
- 莫队算法
- VS2015快捷键
- 机器学习算法原理与实践(六)、感知机算法
- Good Bye 2015 D. New Year and Ancient Prophecy(dp+LCP)
- javaKMP算法
- Java递归算法
- SpringMVC基础-HelloWorld
- shell 脚本 测试webApp
- 验证思路(转)
- Java8新特性
- java tomcat 远程调试 在服务器上debug
- ActiveMQ 主备