HDU1241&POJ2386 dfs简单题

2道题目都差不多,就是问和相邻所有点都有相同数据相连的作为一个联通快,问有多少个连通块

因为最近对搜索题目很是畏惧,总是需要看别人代码才能上手,就先拿这两道简单的dfs题目来练练手,顺便理一理dfs的思路,分析清楚dfs的退出递归的条件和什么时候进行递归调用是至关重要的,这两道题目不涉及回溯,对于需要回溯的题目也要清楚分析,找到回溯条件,在对一个新的状态dfs时,后面加上回溯的语句

HDU1241代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5
 6 int n,m,ans;
 7 int visit[102][102],dir[8][2] = {{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
 8 char mat[102][102];
 9
10 void dfs(int a,int b)
11 {
12     visit[a][b] = 1;
13     for(int i=0;i<8;i++){
14         int xx = a+dir[i][0];
15         int yy = b+dir[i][1];
16         if(xx>=0&&xx<n&&yy>=0&&yy<m&&mat[xx][yy]==‘@‘){
17             if(!visit[xx][yy])
18                 dfs(xx,yy);
19         }
20     }
21 }
22 int main()
23 {
24     while(~scanf("%d%d",&n,&m)){
25         if(n==0&&m==0) break;
26
27         for(int i=0;i<n;i++){
28             for(int j=0;j<m;j++)
29                 cin>>mat[i][j];
30         }
31
32         memset(visit,0,sizeof(visit));
33         ans = 0;
34
35         for(int i=0;i<n;i++)
36         {
37             for(int j=0;j<m;j++)
38                 if(!visit[i][j]&&mat[i][j] == ‘@‘)
39                 {
40                     dfs(i,j);
41                     ans++;
42                 }
43         }
44
45         printf("%d\n",ans);
46     }
47     return 0;
48 }

POJ2386代码:

 1 #include <cstdio>
 2 #include <cstring>
 3
 4 using namespace std;
 5
 6 #define N 102
 7
 8 int n,m,ans;
 9 int visit[N][N],dir[8][2] = {{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
10 char mat[N][N];
11
12 void dfs(int x,int y)
13 {
14     visit[x][y]=1;
15     for(int i=0;i<8;i++){
16         int xx=x+dir[i][0];
17         int yy=y+dir[i][1];
18         if(xx>=0&&x<n&&yy>=0&&yy<m&&mat[xx][yy]==‘W‘&&!visit[xx][yy])
19             dfs(xx,yy);
20     }
21 }
22
23 int main()
24 {
25     while(~scanf("%d%d",&n,&m)){
26         for(int i=0;i<n;i++)
27             scanf("%s",mat[i]);
28
29         memset(visit,0,sizeof(visit));
30         ans=0;
31
32         for(int i = 0 ;i<n;i++)
33         for(int j=0;j<m;j++){
34             if(mat[i][j] == ‘W‘&&!visit[i][j])
35             {
36                 dfs(i,j);
37                 ans++;
38             }
39         }
40
41         printf("%d\n",ans);
42     }
43     return 0;
44 }
时间: 2024-10-12 12:23:16

HDU1241&POJ2386 dfs简单题的相关文章

HDU1584 蜘蛛牌 DFS 简单题

题意: 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有的牌按同一花色从小到大排好,为了简单起见,我们的游戏只有同一花色的10张牌,从A到10,且随机的在一行上展开,编号从1到10,把第i号上的牌移到第j号牌上,移动距离为abs(i-j),现在你要做的是求出完成游戏的最小移动距离. 输入: 第一个输入数据是T,表示数据的组数.每组数据有一行,10

HDU1016 Prime Ring Problem DFS 简单题

题意:输入n,代表有一个n个节点的环,然后在节点分别填入1到n这n个数,规定,第一个填入的必须是1. 0<n<40 要求填入后满足,任意相邻的2个节点的数之和为素数. 将满足条件的填法按照字典序的顺序小到大依次输出. 其实刚开始做的时候我觉得这道题会做很久的,想好后就开始打了,打着打着发现这道题打好了,有点意外,原来这么简单. 注意回溯,在每次DFS后要记得把状态恢复原样,比如这道题是每次DFS后都要把当前DFS的数字i恢复为vis[i]=false; 先考虑好初始化,结束条件,回溯. 先来一

LeetCode Generate Parentheses 构造括号串(DFS简单题)

题意: 产生n对合法括号的所有组合,用vector<string>返回. 思路: 递归和迭代都可以产生.复杂度都可以为O(2n*合法的括号组合数),即每次产生出的括号序列都保证是合法的. 方法都是差不多的,就是记录当前产生的串中含有左括号的个数cnt,如果出现右括号,就将cnt--.当长度为2*n的串的cnt为0时,就是答案了,如果当前cnt比剩下未填的位数要小,则可以继续装“(”,否则不能再装.如果当前cnt>0,那么就能继续装“)”与其前面的左括号匹配(无需要管匹配到谁,总之能匹配)

HDU 1010 Tempter of the Bone DFS 简单题 注意剪枝

题意:一只小狗要刚好在t时刻从起点都到终点,问可不可以. 注意剪枝. 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 using namespace std; 5 int maze[9][9]; 6 bool vis[9][9]; 7 int n,m,t; 8 bool ans; 9 struct Point 10 { 11 int x,y; 12 }; 13 int dx[4]={0,0,-1,1}

HDU 1258 Sum It Up DFS 简单题 好题

给出一个数t,n,然后后面有n个数. 问:从这n个数里面能不能挑出一些数,使得和为t,注意输出顺序. Sample Input 4 6 4 3 2 2 1 1 5 3 2 1 1 400 12 50 50 50 50 50 50 25 25 25 25 25 25 0 0 Sample Output Sums of 4: 4 3+1 2+2 2+1+1 Sums of 5: NONE Sums of 400: 50+50+50+50+50+50+25+25+25+25 50+50+50+50+5

HDU 1175 连连看 DFS 简单题

Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去.不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的.现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过.玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能

HDU2610 Sequence one DFS 简单题 好题

Sequence one Problem Description Search is important in the acm algorithm. When you want to solve a problem by using the search method, try to cut is very important.Now give you a number sequence, include n (<=1000) integers, each integer not bigger

HDU 2553 N皇后问题 DFS 简单题

Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出有多少种合法的放置方法. Input 共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量:如果N=0,表示结束. Output 共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量. Sample Input 1 8 5 0 Sample Output 1 92 10 只需要开一

HDU 1426 Sudoku Killer DFS 简单题

给出一个数独的一部分,然后然后要我们填完整这个数独. Input 本题包含多组测试,每组之间由一个空行隔开.每组测试会给你一个 9*9 的矩阵,同一行相邻的两个元素用一个空格分开.其中1-9代表该位置的已经填好的数,问号(?)表示需要你填的数. Output 对于每组测试,请输出它的解,同一行相邻的两个数用一个空格分开.两组解之间要一个空行.对于每组测试数据保证它有且只有一个解. Sample Input 7 1 2 ? 6 ? 3 5 8 ? 6 5 2 ? 7 1 ? 4 ? ? 8 5 1