poj-1979 red and black(搜索)

Time limit1000 ms

Memory limit30000 kB

There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can‘t move on red tiles, he can move only on black tiles.

Write a program to count the number of black tiles which he can reach by repeating the moves described above.

Input

The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.

There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.

‘.‘ - a black tile 
‘#‘ - a red tile 
‘@‘ - a man on a black tile(appears exactly once in a data set) 
The end of the input is indicated by a line consisting of two zeros.

Output

For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).

Sample Input

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#[email protected]#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
[email protected]
###.###
..#.#..
..#.#..
0 0

Sample Output

45
59
6
13

题意:红色和黑色的地砖,只能走黑色的地砖,问最多可以走几块地砖题解:dfs
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <list>
using namespace std;
#define PI 3.14159265358979323846264338327950
#define INF 0x3f3f3f3f3f3f3f3f;

char a[25][25];
int vis[25][25];
int m,n,st,en,sum;

void dfs(int x,int y)
{
    a[x][y]=‘#‘;
    sum++;
    if(x-1>=0 && a[x-1][y]==‘.‘)
        dfs(x-1,y);
    if(x+1<n && a[x+1][y]==‘.‘)
        dfs(x+1,y);
    if(y-1>=0 && a[x][y-1]==‘.‘)
        dfs(x,y-1);
    if(y+1<m && a[x][y+1]==‘.‘)
        dfs(x,y+1);
}

int main()
{
    while(scanf("%d %d",&m,&n) && (m||n))
    {
        sum=1;
        int i,j;
        memset(vis,0,sizeof(vis));
        for( i=0;i<n;i++)
            for(j=0;j<m;j++)
            {
                cin>>a[i][j];
                if(a[i][j]==‘@‘)
                {
                    st=i;
                    en=j;
                }
            }
        int x=st,y=en;
        a[x][y]=‘#‘;
        if(x-1>=0 && a[x-1][y]==‘.‘)
            dfs(x-1,y);
        if(x+1<n && a[x+1][y]==‘.‘)
            dfs(x+1,y);
        if(y-1>=0 && a[x][y-1]==‘.‘)
            dfs(x,y-1);
        if(y+1<m && a[x][y+1]==‘.‘)
            dfs(x,y+1);
        printf("%d\n",sum);
    }
}

原文地址:https://www.cnblogs.com/smallhester/p/9499285.html

时间: 2024-10-22 03:30:23

poj-1979 red and black(搜索)的相关文章

POJ 1979 Red and Black 深度优先搜索上手题

Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21738   Accepted: 11656 Description There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a

POJ 1979 Red and Black【深度优先搜索】

题目链接:http://poj.org/problem?id=1979 题目大意:一个矩形的房间地板被分为w*h个小块,每一个小块不是红的就是黑的,你首先站在一个黑色小块上,你只能朝你的四个方向(上下左右)移动,且不能到达红色的小块上,问你最多能到达多少个小块. 很简单的dfs深度优先搜索 没搜索过一个格子,将该格子设置为红色,之后的搜索就不会再搜索到该格子,就不会造成重复,因为该题有很多数据,记得每次处理数据是初始化各数组及其他数据. 代码如下: #include <iostream> #i

POJ 1979 Red and Black (红与黑)

POJ 1979 Red and Black (红与黑) Time Limit: 1000MS    Memory Limit: 30000K Description 题目描述 There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to

《挑战》2.1 POJ POJ 1979 Red and Black (简单的DFS)

B - Red and Black Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1979 Description There is a rectangular room, covered with square tiles. Each tile is col

POJ 1979 Red and Black 四方向棋盘搜索

Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 50913   Accepted: 27001 Description There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a

POJ 1979 Red and Black dfs 难度:0

http://poj.org/problem?id=1979 #include <cstdio> #include <cstring> using namespace std; const int maxn = 21; bool vis[maxn][maxn]; char maz[maxn][maxn]; int n,m; const int dx[4] = {1,-1,0,0}; const int dy[4] = {0,0,1,-1}; int ans; bool in(int

POJ 1979 Red and Black

http://poj.org/problem?id=1979 方法和Lake Counting 完全一样 1 #include <iostream> 2 #include <stdio.h> 3 4 using namespace std; 5 //思路与Lake counting 完全一样 6 const int maxsize = 128; 7 int M,N,cnt; 8 char room[maxsize][maxsize]; 9 int d[2][4] = {{-1, 0

POJ 1979 Red and Black(简单DFS)

Red and Black Description There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he

POJ 1979 Red and Black (DFS)

Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 23904   Accepted: 12927 Description There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a

poj 1979 Red and Black(BFS)

题意:在一个矩形房间里面被瓦片覆盖,分为白色的和红色的,白的可以走,红的不能走,起始位置在白色的瓦片上,可以上下左右移动: ".":白色的瓦片: "#":红色的瓦片: "@":起始位置: 计算可以移动到的白色瓦片的数量: 思路:bfs搜索,设一个变量sum记录,进队就自加: 代码如下: #include <iostream> #include <cstdio> #include <memory.h> #incl