HDU 1312 Red and Black

来源:互联网 发布:霍金对人工智能的看法 编辑:程序博客网 时间:2024/06/01 16:32

Red and Black

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18712    Accepted Submission(s): 11337



Problem 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 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)
 

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.#..........#.#######..#.#.....#..#.#.###.#..#.#..@#.#..#.#####.#..#.......#..#########............11 6..#..#..#....#..#..#....#..#..###..#..#..#@...#..#..#....#..#..#..7 7..#.#....#.#..###.###...@...###.###..#.#....#.#..0 0
 
Sample Output
4559613

题解:一个人的起始点的位置为@点,并且只能在   '.'   上移动,求他能在多少块地砖上移动……


BFS
#include<iostream>#include<algorithm>#include<string.h>#include<stdlib.h>#include<time.h>#include<math.h>#include<queue>;#include<stack>;#include <iostream>#include <queue>#define mem(a) memset(a,0,sizeof(a))using namespace std;int n,m,nn,mm;char map[25][25];bool v[25][25];int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};           /*移动的四种情形,分别为向上向下向左向右……*/int check(int x,int y)                                 /*判断法此时的坐标是否符合条件*/{    if(x>=0&&x<n&&y>=0&&y<m&&!v[x][y]&&map[x][y]=='.')        return 1;    return 0;}void bfs(int t){    queue<int>q;    q.push(t);    while(!q.empty())    {        t=q.front();        q.pop();        int ta=t/m,tb=t%m;        for(int i=0;i<4;i++)        {            int tta=d[i][0]+ta,ttb=tb+d[i][1];            if(check(tta,ttb))            {                v[tta][ttb]=true;                q.push(tta*m+ttb);            }        }    }}int main(){    while(cin>>m>>n,n,m)    {        mem(v);        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)        {            cin>>map[i][j];            if(map[i][j]=='@')                nn=i,mm=j;        }        v[nn][mm]=true;        bfs(nn*m+mm);        int sum=0;        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)            if(v[i][j])sum++;        cout<<sum<<endl;    }}

DFS
#include<iostream>#include<algorithm>#include<string.h>#include<stdlib.h>#include<time.h>#include<math.h>#include<queue>;#include<stack>;#include <iostream>#include <queue>#define mem(a) memset(a,0,sizeof(a))using namespace std;char map[25][25];bool v[25][25];int d[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};                   /*移动的四种情形,分别为向上向下向左向右……*/int n,m,nn,mm,sum;int check(int x,int y)                                        /*判断法此时的坐标是否符合条件*/{{    if(x>=0&&x<n&&y>=0&&y<m&&!v[x][y]&&map[x][y]=='.')        return 1;    return 0;}void dfs(int x,int y){    sum++;                                              /*计数*/    v[x][y]=true;    for(int i=0; i<4; i++)    {        int ta=x+d[i][0],tb=y+d[i][1];        if(check(ta,tb))        {            v[ta][tb]=true;            dfs(ta,tb);        }    }    return ;}int main(){    while(cin>>m>>n,n,m)    {        mem(v);        for(int i=0; i<n; i++)            for(int j=0; j<m; j++)            {                cin>>map[i][j];                if(map[i][j]=='@')                    nn=i,mm=j;            }        sum=0;        v[nn][mm]=true;        dfs(nn,mm);        cout<<sum<<endl;    }}





0 0