不相交集类应用:迷宫生成
时间:2022-04-22
本文章向大家介绍不相交集类应用:迷宫生成,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 #include <iostream>
2 #include <vector>
3 #include <cstdlib>
4 #include <ctime>
5
6 #define N 100
7
8 using namespace std;
9
10 int wall_row[N+1][N];
11 int wall_col[N][N+1];
12
13 class DisjSets
14 {
15 public:
16 explicit DisjSets(int numElements);
17
18 int find(int x) const;
19 void unionSets(int node1, int node2);
20 bool connected(int node1, int node2) const
21 {
22 return find(node1) == find(node2);
23 }
24
25 private:
26 vector<int> s;
27 };
28
29 DisjSets::DisjSets(int numElements):s(numElements)
30 {
31 for (int i = 0; i < s.size(); i++)
32 s[i] = -1;
33 }
34
35 int DisjSets::find(int x) const
36 {
37 if (s[x] < 0)
38 return x;
39 else
40 return find(s[x]);
41 }
42
43 void DisjSets::unionSets(int node1, int node2)
44 {
45 int root1 = find(node1);
46 int root2= find(node2);
47
48 if (root1==root2)
49 return;
50
51 if (s[root2] < s[root1])
52 s[root1] = root2;
53 else
54 {
55 if(s[root1] == s[root2])
56 s[root1]--;
57 s[root2] = root1;
58 }
59 }
60
61 void fill(int value)
62 {
63 int i,j;
64 for(i=0; i<N+1; i++)
65 for(j=0; j<N; j++)
66 wall_row[i][j] = value;
67 for(i=0; i<N; i++)
68 for(j=0; j<N+1; j++)
69 wall_col[i][j] = value;
70 }
71
72 void print()
73 {
74 int i, j;
75 for (i=0; i<N+1; i++)
76 {
77 for (j=0; j<N+1; j++)
78 {
79 if (i > 0)
80 {
81 if(wall_col[i-1][j])
82 cout<<"|";
83 else
84 cout<<" ";
85 }
86 if (j<N)
87 {
88 if (i>0)
89 {
90 if (wall_row[i][j])
91 cout<<"_";
92 else
93 cout<<" ";
94 }
95 else
96 {
97 if(wall_row[i][j])
98 cout<<" _";
99 else
100 cout<<" ";
101 }
102 }
103 }
104 cout<<endl;
105 }
106 }
107
108 void map_rand(int x, int &type, int &a, int &b)
109 {
110 type = 0;
111 if(x >= N*(N-1))
112 type = 1;
113 if(type == 0)
114 {
115 a = x / (N - 1);
116 b = x % (N - 1) + 1;
117 }
118 else
119 {
120 x -= N*(N-1);
121 a = x / N + 1;
122 b = x % N;
123 }
124 }
125
126 void map_pos(int type, int a, int b, int &node1, int &node2)
127 {
128 if(type == 0)
129 {
130 node1 = a * N + b - 1;
131 node2 = a * N + b;
132 } else
133 {
134 node1 = (a - 1) * N + b;
135 node2 = (a - 1) * N + b + N;
136 }
137 }
138
139 int randselect(void)
140 {
141 int range = N*(N-1)*2;
142 return rand() % range;
143 }
144
145 int main()
146 {
147 fill(1); //赋值全部为1
148 srand(time(0));
149 wall_row[0][0] = 0;
150 wall_col[0][0] = 0;
151 wall_row[N][N-1] = 0;
152 wall_col[N-1][N] = 0;//定义出口入口
153
154 int amount = N * N;
155
156 DisjSets s(amount);
157
158 while(!s.connected(0, amount-1)) //是否两个节点相连(相同)
159 {
160 int type, a, b;
161 do
162 {
163 int wall = randselect();
164 map_rand(wall, type, a, b);
165 }
166 while ((type == 0 && wall_col[a][b] == 0) ||(type == 1 && wall_row[a][b] == 0))
167 ;
168 int node1, node2;
169 map_pos(type, a, b, node1, node2);
170 if(!s.connected(node1, node2))
171 {
172 if(type == 0)
173 wall_col[a][b] = 0;
174 else
175 wall_row[a][b] = 0;
176 s.unionSets(node1, node2);
177 }
178 }
179 print();
180 return 0;
181 }
生成结果“
- 数据结构是哈希表(hashTable)(二)
- Oracle的Replace函数与translate函数详解与比较
- 关于奇怪的并行进程分析(二) (r6笔记第46天)
- Linux性能分析工具与图形化方法
- MySQL和Oracle中的隐式转换(r6笔记第45天)
- R语言的数据导入与导出(write.table,CAT)
- gqlplus的简单使用(r6笔记第43天)
- Java基础-21(01)总结字符流,IO流编码问题,实用案例必做一遍
- zabbix中配置dg的监控(r6笔记第62天)
- Apache ActiveMQ 远程代码执行漏洞 (CVE-2016-3088)分析
- mysql5.5与mysq 5.6中禁用innodb引擎的方法
- 缓慢的update语句性能分析(r6笔记第61天)
- 一个dg警告发现的硬件问题 (r6笔记第60天)
- mysql几种存储引擎介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 还在手写单表的增删改查??还不快快使用通用mapper
- mybatis动态sql之遍历集合(学习foreach标签(初探))
- mybatis动态sql之修改(学习set标签)
- mybatis文件映射之利用延迟加载解决分布查询每次查询Employee时都得查Department(四)
- mybatis文件映射之select操作返回List集合
- mybatis动态sql之foreach补充(三)
- mybatis动态sql之使用foreach进行批量插入的两种方式
- Shiro异常java.lang.IllegalArgumentException: Odd number of characters解决方案
- Greenplum快速上手
- mybatis文件映射之利用association进行关联查询之分步查询(三)
- 操作系统实验之多线程操作之读者优先与写者优先第二版
- Transformers Assemble(PART II)
- 剑指offer(04-06)题解
- 剑指offer(10-12)题解
- mybatis动态sql之bind标签