您的位置:首页 > 其它

UVA 657 The die is cast (DFS*2)

2015-12-21 06:52 417 查看
分析:双DFS,一个搜索*,一个搜索X;(遍历完每个地方后把他变为背景‘.’)

题意就是判断X(连通算一个,四方向遍历)的个数,也就是筛子的点数。

题意很简单,但程序写起来还是有难度的,WA数次。(本题类似于古代象形符号)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cstdlib>
using namespace std;
const int maxn=55;
char pic[maxn][maxn];
int cnt;
int i_cmp(void const *x,void const *y)
{
return *(int*)x-*(int*)y;
}
void dfs(int r,int c)
{
if (pic[r][c]!='X')return ;
else pic[r][c]='.';
dfs(r-1,c);dfs(r,c-1);
dfs(r,c+1);dfs(r+1,c);
}
void dfs2(int r,int c)
{
if (pic[r][c]=='.') return ;
if (pic[r][c]=='X')
{
dfs(r,c);
cnt++;
}
pic[r][c]='.';
dfs2(r-1,c);dfs2(r,c-1);
dfs2(r,c+1);dfs2(r+1,c);
}
int main()
{
int kase=0,dote[100];
int n,m,ct;
while (scanf("%d%d",&n,&m)==2&&m&&n)
{
memset(pic,'.',sizeof(pic));
for(int i=1; i<=m; i++)
{
getchar();
for(int j=1; j<=n; j++)
scanf("%c",&pic[i][j]);
}
ct=0;
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
{
if (pic[i][j]=='*')
{
cnt=0;
dfs2(i,j);
dote[ct++]=cnt;
}
}
printf("Throw %d\n", ++kase);
qsort(dote,ct,sizeof(dote[0]),i_cmp);
for(int i=0; i<ct; i++)
{
if(i)
printf(" ");
printf("%d",dote[i]);
}
printf("\n\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: