博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1198
阅读量:5035 次
发布时间:2019-06-12

本文共 1047 字,大约阅读时间需要 3 分钟。

此题是搜索入门题目。以某一点为中心,向四个方向搜索。搜过的做好标记,将不再搜。每个点遍历一次,当搜索完一次,代表连通分支又多一个。最后得到的连通分支数就是我们所要求的。

以下是代码:

#include<iostream>

#include<cstdio>
#include<cstring>
using namespace std;
//上下左右的顺序定义数组0,1,2,3
char a[12][4]={
{1,0,1,0},{1,0,0,1},{0,1,1,0},
{0,1,0,1},{1,1,0,0},{0,0,1,1},{1,0,1,1},{1,1,1,0},
{0,1,1,1},{1,1,0,1},{1,1,1,1}};
int f[3000];
int sign,m,n,sum;
char s[51][51];

void mysearch(int i)

{

if(!f[i]){

if(!sign) {sign=1;sum++;}
//sign=0等于0,说明再一次开始搜
f[i]=1;
int x=i/n,y=i%n;
if(x-1>=0&&!f[i-n]&&a[s[x][y]-65][0] &&a[s[x-1][y]-65][1])
mysearch(i-n);
//向上搜
if(x+1<m&&!f[i+n]&&a[s[x][y]-65][1] &&a[s[x+1][y]-65][0])
mysearch(i+n);
//向下
if(y-1>=0&&!f[i-1]&&a[s[x][y]-65][2] &&a[s[x][y-1]-65][3])
mysearch(i-1);
//向左
if(y+1<n&&!f[i+1]&&a[s[x][y]-65][3] &&a[s[x][y+1]-65][2])
mysearch(i+1);
//向右
}
}
int main()
{
int i;
while(cin>>m>>n){
if(m==-1&&n==-1) break;
sum=0;
for(i=0;i<m;i++)
scanf("%s",s[i]);
for(i=0;i<m*n;i++){
sign = 0;
mysearch(i);
}
cout<<sum<<endl;
memset(f,0,sizeof f);
}
return 0;
}

转载于:https://www.cnblogs.com/Potato-lover/p/3691586.html

你可能感兴趣的文章
层叠加的五条叠加法则(一)
查看>>
设计模式六大原则(5):迪米特法则
查看>>
对Feature的操作插入添加删除
查看>>
javascript String
查看>>
ecshop 系统信息在哪个页面
查看>>
【转】码云source tree 提交超过100m 为什么大文件推不上去
查看>>
Oracle数据库的增、删、改、查
查看>>
阿里市值超越亚马逊 马云开启下半场技术理想
查看>>
MySql执行分析
查看>>
git使用中的问题
查看>>
yaml文件 .yml
查看>>
linux字符集修改
查看>>
phpcms 添加自定义表单 留言
查看>>
mysql 优化
查看>>
读书笔记 ~ Nmap渗透测试指南
查看>>
WCF 配置文件
查看>>
动态调用WCF服务
查看>>
oracle导出/导入 expdp/impdp
查看>>
类指针
查看>>
css修改滚动条样式
查看>>