1. 1562是给定一个M*N的矩阵块,由@和*组成,@表示油田,*表示空地,相邻的(水平或者垂直或者斜边)油田可以组成油田区域,求解矩形一共包含多少个这样的油田区域。
我的思路:应该是图的遍历问题,首先想的是深度遍历,但是需要配合标记数组或者直接更改访问过的位置。不过一开始没有理解清楚题目的意思,光看Sample的结果就看了好半天,汗一个。。。。还好最后看懂了,知道怎么做了
代码如下:
- #include<stdlib.h>
- #include<stdio.h></span>
- char map[101][101];
- int m,n,i,j,sum;
- int DFS(int x,int y) {
- if(map[x][y] != '@' || x < 0 || y < 0 || x > m-1 || y > n-1)
- return 0;
- else {
- map[x][y] = '*';
- DFS(x-1,y-1);
- DFS(x-1,y);
- DFS(x-1,y+1);
- DFS(x,y-1);
- DFS(x,y+1);
- DFS(x+1,y-1);
- DFS(x+1,y);
- DFS(x+1,y+1);
- }
- }
- int main() {
- while(scanf("%d %d",&m,&n) != EOF) {
- if(m == 0)
- return 0;
- for(i = 0; i < m; i++) {
- scanf("%s",map[i]);
- }
- sum=0;
- for(i = 0; i < m; i++)
- for(j = 0; j < n; j++) {
- if(map[i][j] == '@') {
- DFS(i,j);
- sum++;
- }
- }
- printf("%d\n",sum);
- }
- //system("pause");
- return 0;
- }
题目总结:提交AC,但是发现网上使用BFS也可以解决,而且有使用并查集的,这个东西需要学习一下,明天在专门写一篇这个的研究吧,总之,题目的本质就是寻找图的连通分量的个数,至于怎么实现就各有千秋了,需要注意的是这个搜索是8个方向的。
2. 1979 题目的意思还是给定字符矩阵,其中@代表一个人的起始位置,#代表红,.代表黑,人每次行走只能走黑而不能走红,问最多能走多远(其实位置记距离为1)?
我的思路:因为前一个题的影响,对比之下,发现基本上是一样的,只不过这一次是先找到那个起始位置的坐标,然后向上下左右4个方向进行DFS
- #include<stdio.h>
- #include<stdlib.h>
- char map[101][101];
- int m,n,i,j,sum;
- int DFS(int x,int y) {
- if(map[x][y] == '#' || x < 0 || y < 0 || x > m-1 || y > n-1)
- return 0;
- else {
- sum++;
- map[x][y] = '#';
- DFS(x-1,y);
- DFS(x,y-1);
- DFS(x,y+1);
- DFS(x+1,y);
- }
- }
- int main() {
- while(scanf("%d %d",&n,&m) != EOF) {
- if(n == 0)
- return 0;
- for(i = 0; i < m; i++) {
- scanf("%s",map[i]);
- }
- sum=0;
- for(i = 0; i < m; i++)
- for(j = 0; j < n; j++) {
- if(map[i][j] == '@') {
- DFS(i,j);
- }
- }
- printf("%d\n",sum);
- }
- return 0;
- }
题目总结:提交后AC,在网上搜到了解题报告,发现还是作为递归的典型问题来考虑比较好,基本上就是公式:
go(x,y)=1+go(x-1,y)+go(x+1,y)+go(x,y-1)+go(x,y+1)
具体的实现代码可以参见
http://www.cppblog.com/NARUTOACM/archive/2009/09/04/95324.h