河南第四届ACM省赛(走迷宫)
2016-02-02 20:08
375 查看
题目地址:点击打开链接
思路:这道题主要难在减枝上,单纯的DFS会超时,先把超时代码写上来,有时间改改
错误代码:
重新开了一个变量,交上去T了
思路:这道题主要难在减枝上,单纯的DFS会超时,先把超时代码写上来,有时间改改
错误代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> #include <cctype> typedef long long ll; using namespace std; int map1[110][110]; int visit[110][110]; int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; int n; int flag; void dfs(int x,int y,int max1,int min1) { int i; if(x == n && y == n) { if(max1 - min1 < flag) { flag = max1 - min1; } return; } for(i=0; i<4; i++) { int newx = x + dir[i][0]; int newy = y + dir[i][1]; if(newx >= 1 && newx <=n && newy >=1 && newy <= n && !visit[newx][newy]) { if(map1[newx][newy] > max1) { max1 = map1[newx][newy];//我这错在了max1的值有可能会改变,导致下一次的max1的值是错误的,所有要重开一个变量 } if(map1[newx][newy] < min1) { min1 = map1[newx][newy]; } visit[newx][newy] = 1; dfs(newx,newy,max1,min1); visit[newx][newy] = 0; } } } int main() { int i,j; while(scanf("%d",&n) != EOF) { flag = 130; memset(visit,0,sizeof(visit)); for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { scanf("%d",&map1[i][j]); } } visit[1][1] = 1; int max1 = map1[1][1]; int min1 = map1[1][1]; dfs(1,1,max1,min1); printf("%d\n",flag); } return 0; }超时代吗:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> #include <cctype> typedef long long ll; using namespace std; int map1[110][110]; int visit[110][110]; int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; int n; int flag; void dfs(int x,int y,int max1,int min1) { int i; if(x == n && y == n) { if(max1 - min1 < flag) { flag = max1 - min1; } return; } for(i=0; i<4; i++) { int newx = x + dir[i][0]; int newy = y + dir[i][1]; if(newx >= 1 && newx <=n && newy >=1 && newy <= n && !visit[newx][newy]) { int max2 = max1; int min2 = min1; if(map1[newx][newy] > max1) { max2 = map1[newx][newy]; } if(map1[newx][newy] < min1) { min2 = map1[newx][newy]; } visit[newx][newy] = 1; dfs(newx,newy,max2,min2); visit[newx][newy] = 0; } } } int main() { int i,j; while(scanf("%d",&n) != EOF) { flag = 130; memset(visit,0,sizeof(visit)); for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { scanf("%d",&map1[i][j]); } } visit[1][1] = 1; int max1 = map1[1][1]; int min1 = map1[1][1]; dfs(1,1,max1,min1); printf("%d\n",flag); } return 0; }
重新开了一个变量,交上去T了
相关文章推荐
- 如何高效率协同工作-。工具
- CF 17B Hierarchy
- HDU 2064 汉诺塔III(递归)
- 桌游开放平台API语言参考
- C++ Primer 笔记(一)cin输入的一些用法和注意事项(未完成)
- 设计模式C++实现:管理者模式
- P28 (**) Sorting a list of lists according to length of sublists.
- P28 (**) Sorting a list of lists according to length of sublists.
- java Annotation好文章
- mmap - 用户空间与内核空间
- jQuery初学(一)——关于如何获取网页中的元素
- 简单的使用进程池
- TO-DO List
- 【codevs1228】苹果树,哦
- 五分钟理解一致性哈希算法(consistent hashing)
- 利用sqlplus将sql语句查询结果直接导出到文本文件
- 【设计模式】外观模式——“知道有它就行了,内容不要你懂。”
- Ksoap2和HttpTransportSE的一点使用
- 如果express支持Promise那该多少
- Nginx安装与使用