第二道简单深搜DFS-------------lig1143
2012-03-03 08:59
211 查看
说起lig1143这道题,大有渊源,光代码都编了5次,可谓一波三折。早在这道题出来时,我就试图去做。但那时还不会DFS,无从下手。想用栈解决,又太麻烦了!
终于在掌握深搜之后,AC了。这道题不用任何剪枝,最基础的。可以说,是我第一道自己写出来的。
本想现在写一下,对深搜,广搜的理解。算了,等多算几道题之后再写感悟吧!
AC代码,以后多看看,加深理解:
#include<stdio.h>
#include<string.h>
int map[1002][1002]; //用来记录高度
int map1[1002][1002]; //用来标记。初始化为0, 0表示没有走过,走过之后都标记为1
int n,m,sum;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; //这点很先进,以后要多利用
void dfs(int si,int sj,int max) //深搜
{
int i;
if(si>n||si<=0||sj>m||sj<=0)
return ;
for(i=0;i<4;i++)
{
if(map[si+dir[i][0]][sj+dir[i][1]]<=max&&map1[si+dir[i][0]][sj+dir[i][1]]==0)//如果这个点可通,且没有被走过。则,加上它,并标记
{
//printf("[%d %d]----->",si+dir[i][0],sj+dir[i][1]);
sum++;
map1[si+dir[i][0]][sj+dir[i][1]]=1;
dfs(si+dir[i][0],sj+dir[i][1],max);
}
}
return ;
}
int main()
{
int i,j,p1,p2,max;
while(scanf("%d%d%d%d",&n,&m,&p1,&p2)!=EOF)
{
memset(map1,1,sizeof(map1)); //这个地方,改了好多次,一定要处理好边界
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
map1[i][j]=0;
if(i==p1&&j==p2) max=map[i][j];
}
}
sum=0;
sum++; //表示从第一个坐标(即泉眼)开始
map1[p1][p2]=1; //标记泉眼
dfs(p1,p2,max);
printf("%d\n",sum);
}
return 0;
}
终于在掌握深搜之后,AC了。这道题不用任何剪枝,最基础的。可以说,是我第一道自己写出来的。
本想现在写一下,对深搜,广搜的理解。算了,等多算几道题之后再写感悟吧!
AC代码,以后多看看,加深理解:
#include<stdio.h>
#include<string.h>
int map[1002][1002]; //用来记录高度
int map1[1002][1002]; //用来标记。初始化为0, 0表示没有走过,走过之后都标记为1
int n,m,sum;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; //这点很先进,以后要多利用
void dfs(int si,int sj,int max) //深搜
{
int i;
if(si>n||si<=0||sj>m||sj<=0)
return ;
for(i=0;i<4;i++)
{
if(map[si+dir[i][0]][sj+dir[i][1]]<=max&&map1[si+dir[i][0]][sj+dir[i][1]]==0)//如果这个点可通,且没有被走过。则,加上它,并标记
{
//printf("[%d %d]----->",si+dir[i][0],sj+dir[i][1]);
sum++;
map1[si+dir[i][0]][sj+dir[i][1]]=1;
dfs(si+dir[i][0],sj+dir[i][1],max);
}
}
return ;
}
int main()
{
int i,j,p1,p2,max;
while(scanf("%d%d%d%d",&n,&m,&p1,&p2)!=EOF)
{
memset(map1,1,sizeof(map1)); //这个地方,改了好多次,一定要处理好边界
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
map1[i][j]=0;
if(i==p1&&j==p2) max=map[i][j];
}
}
sum=0;
sum++; //表示从第一个坐标(即泉眼)开始
map1[p1][p2]=1; //标记泉眼
dfs(p1,p2,max);
printf("%d\n",sum);
}
return 0;
}
相关文章推荐
- HRBUST - 1143 泉水 (简单DFS)
- hrbust 1143 泉水(简单dfs)
- RQNOJ 153数的计算(简单dfs)
- poj1117 Pairs of Integers(简单dfs)
- 简单dfs hdu 4536 XCOM Enemy Unknown
- HDU 1426 Sudoku Killer DFS 简单题
- LeetCode Generate Parentheses 构造括号串(DFS简单题)
- 杭电1045————DFS简单难度题目
- 蓝桥杯 历届试题 剪格子 简单的DFS~~注意输入有陷阱~~
- 蓝桥杯 基础练习 2n皇后问题 (简单dfs暴力+优化剪枝)
- HDU 6113 度度熊的01世界(简单dfs)
- [蓝桥杯] 算法训练 未名湖边的烦恼(dp递推或简单dfs)
- POJ 1979 Red and Black (DFS的简单应用)
- poj-3895-Cycles of Lanes 简单DFS
- poj-3895-Cycles of Lanes 简单DFS
- DFS深度优先搜索简单案例:Coin解决方案
- zoj 1002 Fire Net (简单dfs)
- poj 2342 Anniversary party(简单树形dp+dfs)
- OpenJudge简单的整数划分问题两种方法(DFS)(动态规划0ms),全局题号7215,已AC
- POJ 2243 简单搜索 (DFS BFS A*)