寒假刷题之普通之红与黑

Description - 题目描述

有个铺满方形瓷砖的矩形房间,每块瓷砖的颜色非红即黑。某人在一块砖上,他可以移动到相邻的四块砖上。但他只能走黑砖,不能走红砖。

敲个程序统计一下这样可以走到几块红砖上。

Input - 输入

多组测试用例。每组数组开头有两个正整数W和H;W与H分别表示 x- 与 y- 方向上瓷砖的数量。W和W均不超过20。

还有H行数据,每行包含W个字符。每个字符表示各色瓷砖如下。

‘.‘ - 一块黑砖
‘#‘ - 一块红砖
‘@‘ - 一个黑砖上的人(一组数据一个人)
输入以一行两个零为结束。

Output - 输出

对于每组测试用例,输出他从起始砖出发所能抵达的瓷砖数量(包括起始砖)。

Sample Input - 输入样例

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

Sample Output - 输出样例

45
59
6
13

分析:  感觉这个系列的题目都是比较水一点的,不过对于搜索入门的话,还是会比较适合就是了,闲来无事就随便写了写题解。  对于BFS和DFS,感觉BFS一般是用来求解最值问题,然后DFS只是确认某个问题的答案或者某个要求是否可以到达。  这个题只是单纯的问能到达砖块的个数,所以采用的是DFS.

  将输入的地图进行遍历找到当前位置,然后设为起始点,设立一个方向数组,用来决定前进的方向,即上下左右,  将经过的位置进行标记,然后遍历整个地图之后的结果就是答案。

代码:  

#include <stdio.h>
#include <string.h>

int n, m, ans=0;
char map[25][25];
bool isVisited[25][25];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

bool isIn(int x, int y){
 
 if(x<0 || x>=n || y<0 || y>=m || isVisited[x][y] == true || map[x][y] == ‘#‘)
  return false;
 return true;
}

void doIt(int x, int y){
 
 isVisited[x][y] = true;
 ans++;
}

void DFS(int x, int y){
 
 for(int i=0;i<4;i++)
  if(isIn(x+dir[i][0], y+dir[i][1])){
   doIt(x+dir[i][0], y+dir[i][1]);
   DFS(x+dir[i][0], y+dir[i][1]);
  }
}

int main(){
 
 while(scanf("%d%d ",&m, &n) == 2){
  if(n==0 && m==0) break;
  int x, y; 
  for(int i=0; i<n; i++){
   scanf("%s",map[i]);
   for(int j=0; j<m; j++)
    if(map[i][j] == ‘@‘){
     x=i;
     y=j;
    }
  }
  memset(isVisited,false,sizeof(isVisited));
  ans = 1;
  isVisited[x][y] = true;
  DFS(x,y);
  printf("%d\n",ans);
 }
 return 0;
}

时间: 2024-10-05 20:53:09

寒假刷题之普通之红与黑的相关文章

寒假刷题之普通之变形课

呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体. Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理. Input测试数

noi寒假刷题之旅

 1.1编程基础之输入输出(10题) Hello, World! #include<iostream> using namespace std; int main() { cout<<"Hello, World!"<<endl; return 0; } 输出第二个整数 #include<iostream> using namespace std; int main() { int a,b,c; cin>>a>>b&

noi寒假刷题之旅_ 1.8编程基础之多维数组(25题)

»1.8编程基础之多维数组(25题) 上次编辑的时候忘记保存了,前面几题就算了趴懒得 08:矩阵加法 #include<iostream> #define MAX 105 using namespace std; int table[MAX][MAX]; int main() { int n,m; cin>>n>>m; for(int i=0;i<n;++i)for(int j=0;j<m;++j)cin>>table[i][j]; int t;

大二寒假刷题随笔

7.5 学生成绩排序 假设学生的基本信息包括学号.姓名.三门课程成绩以及个人平均成绩,定义一个能够表示学生信息的结构类型.输入n(n<50)个学生的成绩信息,按照学生的个人平均分从高到低输出他们的信息.如果平均分相同,按输入的先后顺序排列. 输入格式: 输入一个正整数n(n<50),下面n行输入n个学生的信息,包括:学号.姓名.三门课程成绩(整数). 输出格式: 输出从高到低排序后的学生信息,包括:学号.姓名.平均分(保留两位小数). 输入样例: 3 101 Zhang 78 87 85 10

寒假刷题之普通之最小差

Description - 题目描述 给定若干位十进制数,你可以通过选择一个非空子集并以某种顺序构建一个数.剩余元素可以用相同规则构建第二个数.除非构造的数恰好为0,否则不能以0打头. 举例来说,给定数字0,1,2,4,6与7,你可以写出10和2467.当然写法多样:210和764,204和176,等等.最后一对数差的绝对值为28,实际上没有其他对拥有更小的差. Input - 输入 输入第一行的数表示随后测试用例的数量. 对于每组测试用例,有一行至少两个不超过10的十进制数字.(十进制数字为0

用js刷题的一些坑

leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也是引用对象,这点常常被忽视,所以在递归的时候传递数组要用arr.slice(0)这样复制一个一样的新数组,不然会出现你传入的数组会被同级的递归改变,结果就不对了. 所以只要数组复制的地方最好都要这么写,除非你真的想引用.而且注意是slice不是splice这两个方法差别很大,你如果用splice(0

LeetCode刷题之一:寻找只出现一次的数字

投简历的时候看到了个刷题网站,http://www.nowcoder.com/527604,就做了一套题,现记录下来. 题目为: Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it withou

【leetcode刷题笔记】Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

BZOJ第一页刷题计划

BZOJ第一页刷题计划 已完成:1 / 100 BZOJ1000:A+B