博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zoj 2412 dfs 求连通分量的个数
阅读量:5810 次
发布时间:2019-06-18

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

题目来源: http://acm.zju.edu.cn/onlinejudge/showRuns.do?contestId=1

 

求连通分量的个数:

搜索时从第一个字符(对应一个正方形)开始,每搜索到一个正方形,对该位置的四个可能方向进行下一步搜索,下一步搜索需要满足的条件是 当前这个正方形有某个方向的搜索方向且下一个正方形也有这个方向的接受(连接)方向,故可进行一步搜索。例如 当前的可走的某个方向为“上”,则下一个正方形的连接方向应该为“下”,同理。上 --下,右-- 左,  下--上,  左---右。 往前走一步,要将当前正方形设置为已访问,表示当前搜索过程不能回到经过的正方形。 一旦前进不了,要回退,回到上一步的情形。

 

代码如下:

1 #include
2 #include
3 #include
4 #include
5 #define N 55 6 using namespace std; 7 char map[N][N]; 8 int flag[N][N]; 9 int m,n;10 int dir[4][2]={
{-1,0},{
0,1},{
1,0},{
0,-1}} ; // 方向是上右下左的顺时针11 // tube1 可走的方向12 // tube2 可被选的方向,13 //搜索需满足这个正方形可以走的方向,且下一个正方形在该方向可被走(连接),故可搜索下一个正方形14 15 int tube1[11][4]={
{
1,0,0,1},{
1,1,0,0},{
0,0,1,1},{
0,1,1,0},{
1,0,1,0},{
0,1,0,1},{
1,1,0,1},{
1,0,1,1},{
0,1,1,1},{
1,1,1,0},{
1,1,1,1}};16 int tube2[11][4]={
{
0,1,1,0},{
0,0,1,1},{
1,1,0,0},{
1,0,0,1},{
1,0,1,0},{
0,1,0,1},{
0,1,1,1},{
1,1,1,0},{
1,1,0,1},{
1,0,1,1},{
1,1,1,1}};17 void dfs(int x,int y)18 {19 int i,xx,yy;20 if(flag[x][y] ) return ; //???????要return21 flag[x][y]= 1;22 for(i=0;i<4;i++)23 {24 if(tube1[map[x][y]-'A'][i])25 {26 xx=x+dir[i][0];27 yy=y+dir[i][1];28 if(xx<0 || xx>m || yy<0 || yy>n) continue;29 if(tube2[map[xx][yy]-'A'][i])30 dfs(xx,yy);31 }32 }33 }34 int main()35 {36 while(cin>>m>>n &&m>=0 &&n>=0)37 {38 int i,j,count;39 count= 0;40 for(i=0;i
>map[i][j];45 flag[i][j]=0;46 }47 }48 for(i=0;i

 

转载于:https://www.cnblogs.com/zn505119020/p/3573799.html

你可能感兴趣的文章
NeHe OpenGL教程 第七课:光照和键盘
查看>>
修改上一篇文章的node.js代码,支持默认页及支持中文
查看>>
Php实现版本比较接口
查看>>
删除设备和驱动器中软件图标
查看>>
第四章 TCP粘包/拆包问题的解决之道---4.1---
查看>>
html语言
查看>>
从源码看集合ArrayList
查看>>
spring-boot支持websocket
查看>>
菜鸟笔记(一) - Java常见的乱码问题
查看>>
我理想中的前端工作流
查看>>
记一次Git异常操作:将多个repository合并到同一repository的同一分支
查看>>
CodeIgniter 3.0 新手捣鼓源码(一) base_url()
查看>>
Chrome 广告屏蔽功能不影响浏览器性能
查看>>
vSphere 6将于2月2日全球同步发表
查看>>
Android状态栏实现沉浸式模式
查看>>
让你的APP实现即时聊天功能
查看>>
iOS 绝对路径和相对路径
查看>>
使用Openfiler搭建ISCSI网络存储
查看>>
iOS - UIViewController
查看>>
IntPtr 转 string
查看>>