POJ1979
大致题意:这里有一个屋,人只能走黑砖,不能走红砖,而且只能朝上下左右四个放下走,问总共从@出发总共能到多少黑砖,注意:@本身代表一个黑砖。
'.' - a black tile
黑色的砖
'#'- a red tile 红色的砖
'@'- a man on a black tile(appears exactly once in a data set)
解题思路:
DFS递归
#include<cstdio>
#include<string.h>
#include<stdio.h>
int w,h,mark;
int in[30][30];
int ans=0;
int i0,j0;
using namespace std;
void dfs(int i,int j)
{
if (in[i-1][j]!='#' && i-1<h && i-1>=0) in[i-1][j]='#',ans++,dfs(i-1,j);
if (in[i+1][j]!='#' && i+1<h && i+1>=0) in[i+1][j]='#',ans++,dfs(i+1,j);
if (in[i][j-1]!='#' && j-1<w && j-1>=0) in[i][j-1]='#',ans++,dfs(i,j-1);
if (in[i][j+1]!='#' && j+1<w && j+1>=0) in[i][j+1]='#',ans++,dfs(i,j+1);
}
int main()
{
//freopen("input.txt","r",stdin); //输入重定向
while(1)
{
scanf("%d %d",&w,&h);
if(w==0 && h==0) break; //判断输入结束
ans=0;
memset(in,0,sizeof(in));
getchar(); //处理多余的回车符
for(int i=0;i<h;i++)
{for(int j=0;j<w;j++)
{scanf("%1c",&in[i][j]);
if (in[i][j]=='@') i0=i,j0=j,in[i][j]='#';}getchar();}
dfs(i0,j0);
printf("%d\n",ans+1); //因为@所在的balck tile没有计算,所以+1
}
return 0;
}