I - Red and Black

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d
& %I64u

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

45
59
6
13
#include<stdio.h>
#include<queue>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
char a[25][25];
int b[25][25];
int dir[4][2]= {0,1,1,0,0,-1,-1,0};
struct node
{
int x,y;
} w;
int sum=0;
void bfs(int x,int y)
{
queue<node> q;
int k,i,j;
w.x=x;
w.y=y;
q.push(w);
while(!q.empty())
{
node s=q.front();
q.pop();
for(int i=0; i<4; i++)
{
w.x=s.x+dir[i][0];
w.y=s.y+dir[i][1];
if(!b[w.x][w.y]&&a[w.x][w.y]!='#'&&w.x>=1&&w.x<=m&&w.y>=1&&w.y<=n)
{
sum++;
b[w.x][w.y]=1;
q.push(w);
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m)&&(n||m))
{
sum=0;
int i,j,x=0,y=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(i=1; i<=m; ++i)
scanf("%s",a[i]+1);
for(i=1; i<=m; ++i)
for(j=1; j<=n; ++j)
{
if(a[i][j]=='@')
{
x=i;
y=j;
break;
}
}
b[x][y]=1;
bfs(x,y);
printf("%d\n",sum+1);
}
return 0;
} //#include<iostream>
//#include<string.h>
//#include<stdio.h>
//using namespace std;
//int direct[4][2] = { -1, 0, 1, 0, 0, 1, 0, -1 }; /*定义方向, 左右,上下*/
//char map[21][21]; /*输入的字符串*/
//bool mark[21][21]; /*标记走过的路程*/
//bool flag;
//int W, H;
//int Dx, Dy; //记录起始位置@,从这里开始进行搜索
//int ans; //记录满足的个数。初始化为1,因为@也包含在内
///*****底下是核心算法,主要是从
//上下左右这四个方向进行搜索,注意
//满足搜索的条件是不能越界,不能是#,
//还有就是没有搜索过的--》主要是靠mark[i][j]
//来实现*******/
//void DFS( int x, int y )
//{
// mark[x][y] = true;
// for( int k = 0; k < 4; k ++ )
// {
// int p = x + direct[k][0];
// int q = y + direct[k][1];
// if( p >= 0 && q >= 0 && p < H && q < W && !mark[p][q] && map[p][q] != '#' )
// {
// ans ++;
// DFS( p, q );
// }
// }
// return;
//}
//
//int main()
//{
// int i, j, k;
// while( cin >> W >> H && ( W || H ) ) // W -> column, H -> row;
// {
// memset( mark, false, sizeof( mark ) );
// for( i = 0; i < H; i ++ )
// for( j = 0; j < W; j ++ )
// {
// cin >> map[i][j];
// if( map[i][j] == '@' )
// {
// Dx = i;
// Dy = j;
// }
// }
// ans = 1;
// DFS( Dx, Dy );
// cout << ans << endl;
// }
//}
//
//
// //#include <iostream>
//
//using namespace std;
//char a[50][50];
//int m,n;
//int sum;
//void dfs(int i,int j){
// a[i][j]='#';//把搜素到的点变成#
// sum++;//sum用于计数每搜到一个点就记一下数
// if(i-1>=0&&a[i-1][j]=='.')dfs(i-1,j);
// if(i+1<m&&a[i+1][j]=='.')dfs(i+1,j);
// if(j-1>=0&&a[i][j-1]=='.')dfs(i,j-1);
// if(j+1>=0&&a[i][j+1]=='.')dfs(i,j+1);//四个方向搜素
//}
//int main()
//{
// while(cin>>n>>m&&(m+n)){
// for(int i=0; i<m; i++)
// cin>>a[i];
// sum=0;
// for(int i=0; i<m; i++)
// for(int j=0; j<n; j++){
// if(a[i][j]=='@')
// dfs(i,j);
// }
// cout<<sum<<endl;
// }
// return 0;
//}

hdu1312 Red and Black的更多相关文章

  1. HDU1312——Red and Black(DFS)

    Red and Black Problem DescriptionThere is a rectangular room, covered with square tiles. Each tile i ...

  2. HDU1312 Red and Black(DFS) 2016-07-24 13:49 64人阅读 评论(0) 收藏

    Red and Black Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...

  3. HDU1312 Red and Black 解读

    递归搜索方法标题,采用递归搜索方法,但是,如果没有迭代计算的真正的政党格. 我们的想法是: 1 每一个搜索为党格要改变电流方向格的值至 '*',或任何其他非'.'的值,代表方格了 2 递归的时候不回复 ...

  4. hdu1312 Red and Black 简单BFS

    简单BFS模版题 不多说了..... 直接晒代码哦.... #include<cstdlib> #include<iostream> #include<cstdio> ...

  5. HDU1312 Red and Black(dfs+连通性问题)

    这有一间铺满方形瓷砖的长方形客房. 每块瓷砖的颜色是红色或者黑色. 一个人站在一块黑色瓷砖上, 他可以从这块瓷砖移动到相邻(即,上下左右)的四块瓷砖中的一块. 但是他只能移动到黑色瓷砖上,而不能移动到 ...

  6. HDU1312 / POJ1979 / ZOJ2165 Red and Black(红与黑) 解题报告

    题目链接:pid=1312" target="_blank">HDU1312 / POJ1979 / ZOJ2165 Red and Black(红与黑) Red ...

  7. 数据结构——HDU1312:Red and Black(DFS)

    题目描述 There is a rectangular room, covered with square tiles. Each tile is colored either red or blac ...

  8. 使用Red Gate Sql Data Compare 数据库同步工具进行SQL Server的两个数据库的数据比较、同步

    Sql Data Compare 是比较两个数据库的数据是否相同.生成同步sql的工具. 这一款工具由Red Gate公司出品,我们熟悉的.NET Reflector就是这个公司推出的,它的SQLTo ...

  9. 使用Red Gate Sql Compare 数据库同步工具进行SQL Server的两个数据库的结构比较、同步

    将测试版的项目同步(部署)到正式版的时候,两个数据库的结构比较与同步时,如果修改数据库的时候没有记录好修改了那些表,很难将两个数据库进行同步 RedGate Sql Compare使用简介说明: 1. ...

随机推荐

  1. win7下设置挂载Linux服务器nfs共享的数据 -- 转

    最近学习NFS文件系统的使用,Ubuntu上配置好了,想和Win7共享数据,所以网上搜到了这篇文章.借花献佛,跟大家共享一下: http://www.2cto.com/os/201207/139132 ...

  2. datagrid时间插件

    jquery easyui日期控件中,在页面里用JS拿到设立的日期值的方法 链接:http://blog.csdn.net/liweibin_/article/details/13509917 jqu ...

  3. 【算法学习】老算法,新姿势,STL——Heap

    “堆”是一个大家很熟悉的数据结构,它可以在\(O(log\;n)\)的时间内维护集合的极值. 这都是老套路了,具体的内部实现我也就不谈了. 我一般来说,都是用queue库中的priority_queu ...

  4. Linux内核抢占实现机制分析【转】

    Linux内核抢占实现机制分析 转自:http://blog.chinaunix.net/uid-24227137-id-3050754.html [摘要]本文详解了Linux内核抢占实现机制.首先介 ...

  5. Ubuntu 12.04下LVM2安装和操作实验

    实验环境: VirtualBox v4.3.20 Lubuntu 12.04LTS 前期准备: 1.添加虚拟盘:菜单"控制"->"设置"->&quo ...

  6. Access中替代case when的方法 .

    最近在做一个用Access的东东,其中用到了case when的方式,但是Access是不支持这种语法的,查询知道IIf和Swith可以作为替代,总结如下: IIf(expr, truepart, f ...

  7. Motan

    https://github.com/weibocom/motan/wiki/zh_userguide http://www.cnblogs.com/mantu/p/5885996.html(源码分析 ...

  8. Shell编程学习1--基础了解

    "#!path"告诉系统path所指的程序为用来解释此脚本文件的Shell程序: 如#!/bin/sh, #!/bin/bash Shell Script的后缀名为.sh; ech ...

  9. json的用法

    json格式 JSON格式:http://www.json.org/ python和JSON的关系请参考:http://docs.python.org/library/json.html JSON建构 ...

  10. An overview of gradient descent optimization algorithms (更新到Adam)

    Momentum:解快了收敛速度,同时也减弱了SGD的波动 NAG: 减速了Momentum更新参数太快 Adagrad: 出现频率较低参数采用较大的更新,对于出现频率较高的参数采用较小的,不共用一个 ...