(DFS)hdoj1198-Farm Irrigation

题目链接

DFS的简单应用,比较繁琐的是处理输入的英文字母。用并查集也可以做(可是笔者现在还没有掌握并查集,之前只用过一次,以后学会回来补上)

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 int m,n,typ[12][4]={{1,1,0,0},{1,0,1,0},{0,1,0,1},{0,0,1,1},{1,0,0,1},{0,1,1,0},{1,1,1,0},{1,1,0,1},{0,1,1,1},{1,0,1,1},{1,1,1,1},{0,0,0,0}};
 5 int dir[4][2]={{-1,0},{0,-1},{0,1},{1,0}},a[55][55],cnt;//这里处理的方法是将不同种类的管子标号为0——3,可能联通就是1,不然就是0
 6 char tem[50];
 7 void dfs(int si,int sj)
 8 {
 9     int x1,y1,kind=a[si][sj],z;
10     a[si][sj]=11;//第一步就是先将这个格子初始化为第11种,即各个方向都不联通的格子
11     for(int i=0;i<4;i++)
12     {
13         z=typ[kind][i];
14         if(z==1)
15         {
16             x1=si+dir[i][0];
17             y1=sj+dir[i][1];
18             if(x1<0||x1>=m||y1<0||y1>=n||typ[a[x1][y1]][3-i]==0)//如果超出范围或无法联通则continue;
19                 continue;
20             else
21             {
22                 dfs(x1,y1);
23             }
24         }
25     }
26     return;
27 }
28 int main(){
29 while(scanf("%d%d",&m,&n))
30 {
31     int i,j;
32     cnt=0;
33     if(m<0||n<0)
34         break;
35     else
36     {
37         for(i=0;i<m;i++)
38         {
39             scanf("%s",tem);
40             for(j=0;j<n;j++)
41             {
42                 a[i][j]=tem[j]-‘A‘;//对每个英文字母处理,之前已经为此建好了数组
43             }
44         }
45         for(i=0;i<m;i++)
46         {
47             for(j=0;j<n;j++)
48                 if(a[i][j]!=11)
49             {
50                 cnt++;//每个新看见的非11的格子均为可能联通一大块的整体。
51                 dfs(i,j);
52             }
53         }
54     }
55     printf("%d\n",cnt);
56 }
57 }
时间: 2024-11-05 17:30:47

(DFS)hdoj1198-Farm Irrigation的相关文章

POJ 3087 Shuffle&#39;m Up (DFS)

题目链接:Shuffle'm Up 题意:有a和b两个长度为n的字符序列,现定义操作: 将a.b的字符交叉合并到一个序列c,再将c最上面的n个归为a,最下面n个归为b 给出a,b和目标序列c,问最少多少次操作a.b转化为c 解析:将a.b放入哈希表,然后模拟操作过程直接dfs即可. AC代码: #include <cstdio> #include <iostream> #include <cstring> #include <map> using names

LeetCode Subsets (DFS)

题意: 给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计. 1 class Solution { 2 public: 3 vector<vector<int>> subsets(vector<int>& nums) { 4 sort(nums.begin(),nums.end()); 5 DFS(0,nums,tmp); 6 return a

POJ 1699 Best Sequence(DFS)

題目鏈接 題意 : 將幾個片段如圖所示方法縮成一個序列,求出最短這個序列. 思路 : 其實我也不知道怎麼做.....看網上都用了DP.....但是我不會.....這個DP不錯,還有用KMP+状压DP做的 1 //1699 2 #include <iostream> 3 #include <stdio.h> 4 #include <string.h> 5 #include <string> 6 7 using namespace std; 8 9 string

LeetCode Subsets II (DFS)

题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) 1 class Solution { 2 public: 3 vector<vector<int>> subsets(vector<int>& nums) { 4 sort(nums.begin(),nums.end()); 5 DFS(0,nums,tmp); 6 ans.push_back(vector

poj A Knight&#39;s Journey(DFS)

题目链接:http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=190592 题意:给出p*q的棋盘,从(A,1)开始,走“日”字,问能否走完棋盘上所有的点,如果能,按字典序输出路径: 思路:DFS,并保存路径即可,注意处理走的方向顺序int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}}; #include <stdio.h> #in

11218 - KTV(dfs)

问题 C: Repeat Number 时间限制: 1 Sec  内存限制: 128 MB 提交: 23  解决: 7 [提交][状态][论坛] 题目描述 Definition: a+b = c, if all the digits of c are same ( c is more than ten),then we call a and b are Repeat Number. My question is How many Repeat Numbers in [x,y]. 输入 There

POJ 2488-A Knight&#39;s Journey(DFS)

A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31702   Accepted: 10813 Description Background The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey ar

poj3187Backward Digit Sums(DFS)

题目链接: huangjing 思路: 这个题目想到dfs很容易,但是纠结在这么像杨辉三角一样计算那些值,这个我看的队友的,简直厉害,用递归计算出杨辉三角顶端的值....具体实现详见代码... 题目: Language: Default Backward Digit Sums Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4285   Accepted: 2474 Description FJ and his cows

A Knight&#39;s Journey (DFS)

Background The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. Th

hdu 1016 Prime Ring Problem (dfs)

一切见注释. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; bool vis[22]; int n; int ans[22]; int top; bool isprime(int x)//判断素数 { for(int i=2;i<x;i++) if(x%i==0)return false; return