Problem Description
Input
Output
Sample Input
Sample Output
解题思路:每次左键按在0位置的可以最大范围的扩大安全区域,
把成块的零区域连起来,外面有一层非零的格子;
再加上未不和零直接相邻的数字格子,就得到了答案。
如例子:零区域有4处,然后,加上剩下的20个格子就是24;
#include"stdio.h"
#include"string.h"
#define N 20
char str[N][N];
int mark[N][N],n;
int dir[8][2]={0,1,0,-1,1,0,-1,0,-1,-1,-1,1,1,-1,1,1}; //8个方向
void dfs(int x,int y)
{
int i,di,dj;
if(str[x][y]!=‘0‘) //不是零就返回
return ;
for(i=0;i<8;i++)
{
di=dir[i][0]+x;
dj=dir[i][1]+y;
if(di>=0&&di<n&&dj>=0&&dj<n&&!mark[di][dj]) //搜过的不能再搜,否则会死循环
{
mark[di][dj]=1;
dfs(di,dj);
}
}
}
int main()
{
int i,j,T,ans,cnt=1;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s",str[i]);
memset(mark,0,sizeof(mark));
ans=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(mark[i][j]==0&&str[i][j]==‘0‘) //搜索共有几处0区域并标记
{
mark[i][j]=1;
dfs(i,j);
ans++;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++) //加上剩余的非零格子
{
if(!mark[i][j]&&str[i][j]!=‘@‘)
ans++;
}
printf("Case %d: %d\n",cnt++,ans);
}
return 0;
}
Problem 1920 Left Mouse Button,布布扣,bubuko.com
Problem 1920 Left Mouse Button
原文:http://blog.csdn.net/u011721440/article/details/20391589