1 //===================MCC_Header.h==================
2 //头文件支持
3 #include<iostream>
4 #include<iomanip>
5 #include<vector>
6 using namespace std;
7 //用typedef定义类型
8 typedef vector<char> Collection;
9 typedef vector<vector<char> > Matrix;
10 //相关函数
11 //输出集合
12 void Coll_Print(Collection C);
13 //输出集类
14 void Matrix_Print(Matrix M);
15 //定位元素在集合中的位置
16 int Coll_ChLocate(Collection C, char ch);
17 //判断字符元素是否属于集合
18 bool Coll_ChFind(Collection Ca, char ch);
19 //判断集合(一维向量)是否属于集类(二维向量)
20 bool Matrix_ColFind(Matrix M, Collection C);
21 //判断集合是否包含于集合
22 bool Coll_Belong(Collection Ca, Collection Cb);
23 //集合交
24 Collection Coll_Or(Collection Ca, Collection Cb);
25 //集合并
26 Collection Coll_And(Collection Ca, Collection Cb);
27 //集类并
28 Matrix Matrix_Or(Matrix Ma, Matrix Mb);
29 //集类减运算
30 Matrix Matrix_Minus(Matrix Ma, Matrix Mb);
31 //关系矩阵算法
32 void Make_MCC(Collection Ca, vector<Collection> &pi, vector<vector<bool> > R);
33 //=================MCC_Function.cpp===============
34 #include"MCC_Header.h"
35 //输出集合
36 void Coll_Print(Collection C)
37 {
38 cout << "{";
39 for (int i = 0; i < C.size(); i++)
40 {
41 cout << C[i];
42 if (i != C.size() - 1)
43 cout << ",";
44 }
45 cout << "}";
46 }
47 //输出集类
48 void Matrix_Print(Matrix M)
49 {
50 cout << "{ ";
51 for (int i = 0; i < M.size(); i++)
52 {
53 Coll_Print(M[i]);
54 if (i != M.size() - 1)
55 cout << ",";
56 }
57 cout << " }" << endl;
58
59 }
60 //定位元素在集合中的位置
61 int Coll_ChLocate(Collection C, char ch)
62 {
63 for (int i = 0; i < C.size(); i++)
64 if (C[i] == ch)
65 return i;
66
67 return -1;
68 }
69 //判断字符元素是否属于集合
70 bool Coll_ChFind(Collection Ca, char ch)
71 {
72 for (int i = 0; i < Ca.size(); i++)
73 {
74 if (Ca[i] == ch)
75 return true;
76 }
77
78 return false;
79 }
80 //判断集合(一维向量)是否属于集类(二维向量)
81 bool Matrix_ColFind(Matrix M, Collection C)
82 {
83 for (int i = 0; i < M.size(); i++)
84 if (M[i] == C)
85 return true;
86
87 return false;
88 }
89 //判断集合Ca是否包含于集合Cb
90 bool Coll_Belong(Collection Ca, Collection Cb)
91 {
92 if (Ca.size() > Cb.size())
93 return false;
94 else
95 {
96 for (int i = 0; i < Ca.size(); i++)
97 {
98 if (!Coll_ChFind(Cb, Ca[i]))
99 return false;
100 }
101
102 return false;
103 }
104
105 }
106 //集合交
107 Collection Coll_Or(Collection Ca, Collection Cb)
108 {
109 int min = (Ca.size() > Cb.size() ? Cb.size() : Ca.size());
110
111 Collection CB = (Ca.size() > Cb.size() ? Ca : Cb);
112 Collection CS = (Ca.size() > Cb.size() ? Cb : Ca);
113
114 Collection Cc;
115
116 for (int i = 0; i < min; i++)
117 {
118 if (Coll_ChFind(CB, CS[i]))
119 Cc.push_back(CS[i]);
120 }
121
122 return Cc;
123 }
124 //集合并
125 Collection Coll_And(Collection Ca, Collection Cb)
126 {
127 int min = (Ca.size() > Cb.size() ? Cb.size() : Ca.size());
128
129 Collection CB = (Ca.size() > Cb.size() ? Ca : Cb);
130 Collection CS = (Ca.size() > Cb.size() ? Cb : Ca);
131
132
133 for (int i = 0; i < min; i++)
134 {
135 if (!Coll_ChFind(CB, CS[i]))
136 CB.push_back(CS[i]);
137 }
138 return CB;
139 }
140 //集类并
141 Matrix Matrix_Or(Matrix Ma, Matrix Mb)
142 {
143 int min = (Ma.size() > Mb.size() ? Mb.size() : Ma.size());
144 Matrix MB = (Ma.size() > Mb.size() ? Ma : Mb);
145 Matrix MS = (Ma.size() > Mb.size() ? Mb : Ma);
146
147 for (int i = 0; i < min; i++)
148 if (!Matrix_ColFind(MB, MS[i]))
149 MB.push_back(MS[i]);
150
151 return MB;
152 }
153 //集类减运算
154 Matrix Matrix_Minus(Matrix Ma, Matrix Mb)
155 {
156 int i, min = (Ma.size() > Mb.size() ? Mb.size() : Ma.size());
157 Matrix Mc;
158
159 for (i = 0; i < min; i++)
160 {
161 if (!Matrix_ColFind(Mb, Ma[i]))
162 Mc.push_back(Ma[i]);
163 }
164 if (min == Ma.size())
165 return Mc;
166 else
167 {
168 for (; i < Ma.size(); i++)
169 Mc.push_back(Ma[i]);
170 return Mc;
171 }
172 }
173 //关系矩阵算法
174 void Make_MCC(Collection Ca, vector<Collection> &pi, vector<vector<bool> > R)
175 {
176 int n = Ca.size(), i, j, k;
177 Collection A = Ca, Xi;
178 Collection S, S1, S2, Col_temp1, Col_temp2;
179 vector<Collection> Mat_temp1, Mat_temp2;
180
181 if (n == 1)
182 {
183 cout << "Can't Creat the MCC!\n";
184 return;
185 }
186 //关系矩阵算法(详参见教材P108)
187 for (i = n - 1; i > 1; i--)
188 {
189 Xi.clear();
190 Xi.push_back(Ca[i - 1]);
191
192 A.clear();
193 for (j = i + 1; j <= n; j++)
194 {
195 if (R[j - 1][i - 1])
196 A.push_back(Ca[j - 1]);
197 }
198 for (k = 0; k < pi.size(); k++)
199 {
200 S = pi[k];
201 if ((Coll_And(S, A)).size() != 0)
202 {
203 Col_temp1.clear();
204 Col_temp2.clear();
205
206 Col_temp1 = Coll_And(S, A);
207 Col_temp2 = Coll_Or(Xi, Col_temp1);
208
209 Mat_temp1.clear();
210 Mat_temp1.push_back(Col_temp2);
211
212
213 pi = Matrix_Or(pi, Mat_temp1);
214 }
215 }
216 for (i = 0; i < pi.size(); i++)
217 {
218 S1.clear();
219 S1 = pi[i];
220 for (j = 0; j < pi.size(); j++)
221 {
222 S2.clear();
223 S2 = pi[j];
224 if (Coll_Belong(S1, S2))
225 {
226 Mat_temp2.clear();
227 Mat_temp2.push_back(S1);
228
229 pi = Matrix_Minus(pi, Mat_temp2);
230 }
231 }
232 }
233 }
234 }
235 #include"MCC_Header.h"
236 int main()
237 {
238 Collection A;
239 Matrix pi;
240 vector<vector<bool> > R;
241 char ch, ch1, ch2;
242 int number, i, j;
243 //输入A中元素的个数
244 cout << "Please Input The Number Of A's Elements:\n";
245 cin >> number;
246 //输入A中的各个元素
247 cout << "Please Input Each Element Of A:\n";
248 for (i = 0; i < number; i++)
249 {
250 cin >> ch;
251 A.push_back(ch);
252 }
253 //输出集合A
254 cout << "Output A As Followed:\n";
255 cout << "A=";
256 Coll_Print(A);
257 cout << endl;
258 //初始化关系矩阵R并输出
259 vector<bool> bl_temp(A.size(), 0);
260 for (i = 0; i < A.size(); i++)
261 R.push_back(bl_temp);
262 cout << "Initialize Matrix R AS 0 Matrix And Output As Followed:\n";
263 for (i = 0; i < R.size(); i++)
264 {
265 for (j = 0; j < R[0].size(); j++)
266 cout << R[i][j] << " ";
267 cout << endl;
268 }
269 //请输入序偶(以#字符结束输入)来重置矩阵并输出
270 cout << "Now,Type The T_Char To ReInitialize R:\n";
271 while (cin >> ch1 >> ch2 && ch1 != '#')
272 {
273 R[Coll_ChLocate(A, ch1)][Coll_ChLocate(A, ch2)] = 1;
274 }
275 cout << "Output Matrix R as Followed:\n";
276 for (i = 0; i < R.size(); i++)
277 {
278 for (j = 0; j < R[0].size(); j++)
279 cout << R[i][j] << " ";
280 cout << endl;
281 }
282 //初始化pi并输出
283 vector<char> ch_temp;
284 for (i = 0; i < A.size(); i++)
285 {
286 ch_temp.clear();
287 ch_temp.push_back(A[i]);
288 pi.push_back(ch_temp);
289 }
290 cout << "Initialize Matrix pi And Output As Followed:\n";
291 cout << "pi=\n";
292 Matrix_Print(pi);
293 //调用关系矩阵函数
294 Make_MCC(A, pi, R);
295 cout << "The Maximal_Consistent_Class Have Been Created As Followed:\n";
296 for (i = 0; i < pi.size(); i++)
297 {
298 Coll_Print(pi[i]);
299 cout << endl;
300 }
301 return 0;
302 }
1 #include<stdio.h>
2 #include<stdlib.h>
3 typedef enum { ERROR, OK } Status;
4 typedef struct
5 {
6 int row, line;
7 }PosType;
8
9 typedef struct
10 {
11 int di, ord;
12 PosType seat;
13 }SElemType;
14
15 typedef struct
16 {
17 SElemType * base;
18 SElemType * top;
19 int stacksize;
20 }SqStack;
21
22 Status InitStack(SqStack &S);
23 Status Push(SqStack &S, SElemType &a);
24 Status Pop(SqStack &S, SElemType &a);
25 Status StackEmpty(SqStack S);
26 Status MazePath(int maze[12][12], SqStack &S, PosType start, PosType end);
27 void Initmaze(int maze[12][12], int size);
28 void printmaze(int maze[12][12], int size);
29 Status Pass(int maze[12][12], PosType CurPos);
30 void Markfoot(int maze[12][12], PosType CurPos);
31 PosType NextPos(PosType CurPos, int Dir);
32 void printpath(int maze[12][12], SqStack S, int size);
33 void main(void)
34 {
35 SqStack S;
36 int size, maze[12][12];
37 for (int n = 0; n < 10; n++)
38 {
39 printf("创建一个正方形迷宫,请输入迷宫尺寸(注意不要大于50):\n");
40 scanf("%d", &size);
41 if (size < 1 || size>10)
42 {
43 printf("输入错误!");
44 return;
45 }
46 Initmaze(maze, size);
47 printmaze(maze, size);
48 PosType start, end;
49 printf("输入入口行坐标和列坐标:");
50 scanf("%d", &start.row);
51 scanf("%d", &start.line);
52 printf("输入出口行坐标和列坐标:");
53 scanf("%d", &end.row);
54 scanf("%d", &end.line);
55 if (MazePath(maze, S, start, end))
56 printpath(maze, S, size);
57 else
58 printf("找不到通路!\n\n");
59 }
60 }
61 Status MazePath(int maze[12][12], SqStack &S, PosType start, PosType end)
62 {
63 PosType curpos;
64 int curstep;
65 SElemType e;
66 InitStack(S);
67 curpos = start;
68 curstep = 1;
69 do {
70 if (Pass(maze, curpos))
71 {
72 Markfoot(maze, curpos);
73 e.di = 1;
74 e.ord = curstep;
75 e.seat = curpos;
76 Push(S, e);
77 if (curpos.row == end.row && curpos.line == end.line)
78 return OK;
79 curpos = NextPos(curpos, 1);
80 curstep++;
81 }
82 else
83 {
84 if (!StackEmpty(S))
85 {
86 Pop(S, e);
87 while (e.di == 4 && !StackEmpty(S))
88 {
89 Markfoot(maze, e.seat);
90 Pop(S, e);
91 }
92 if (e.di < 4)
93 {
94 e.di++;
95 Push(S, e);
96 curpos = NextPos(e.seat, e.di);
97 }
98 }
99 }
100 } while (!StackEmpty(S));
101 return ERROR;
102 }
103 void Initmaze(int maze[12][12], int size)
104 {
105 char select;
106 printf("选择创建方式 A:自动生成 B:手动创建\n");
107 label:scanf("%c", &select);
108 if (select == 'a' || select == 'A')
109 {
110 for (int i = 0; i < size + 2; i++)
111 maze[0][i] = 1;
112 for (int i = 1; i < size + 1; i++)
113 {
114 maze[i][0] = 1;
115 for (int j = 1; j < size + 1; j++)
116 maze[i][j] = rand() % 2;
117 maze[i][size + 1] = 1;
118 }
119 for (int i = 0; i < size + 2; i++)
120 maze[size + 1][i] = 1;
121 }
122 else if (select == 'b' || select == 'B')
123 {
124 printf("按行输入%d*%d数据,0代表可通,1代表不可通(每行以Enter结束):\n", size, size);
125 for (int i = 0; i < size + 2; i++)maze[0][i] = 1;
126 for (int i = 1; i < size + 1; i++)
127 {
128 maze[i][0] = 1;
129 for (int j = 1; j < size + 1; j++)
130 scanf("%d", &maze[i][j]);
131 maze[i][size + 1] = 1;
132 }
133 for (int i = 0; i < size + 2; i++)
134 maze[size + 1][i] = 1;
135 }
136 else if (select == '\n')
137 goto label;
138 else printf("输入错误!");
139 }
140 void printmaze(int maze[12][12], int size)//
141 {
142 printf("\n\n");
143 printf("显示所建的迷宫(#表示外面的墙):\n");
144 for (int i = 0; i < size + 2; i++)
145 printf("%c ", '#');
146 printf("\n");
147 for (int i = 1; i < size + 1; i++)
148 {
149 printf("%c ", '#');
150 for (int j = 1; j < size + 1; j++)
151 {
152 printf("%d ", maze[i][j]);
153 }
154 printf("%c", '#');
155 printf("\n");
156 }
157 for (int i = 0; i < size + 2; i++)
158 printf("%c ", '#');
159 printf("\n");
160
161 }
162
163 void printpath(int maze[12][12], SqStack S, int size)
164 {
165 printf("\n\n通路路径为:\n");
166 SElemType * p = S.base;
167 while (p != S.top)
168 {
169 maze[p->seat.row][p->seat.line] = 2;
170 p++;
171 }
172 for (int i = 0; i < size + 2; i++)
173 printf("%c ", '#'); printf("\n");
174 for (int i = 1; i < size + 1; i++)
175 {
176 printf("%c ", '#');
177 for (int j = 1; j < size + 1; j++)
178 {
179 if (maze[i][j] == 2)
180 printf("%c ", '0');
181 else
182 printf(" ");
183 }
184 printf("%c", '#');
185 printf("\n");
186 }
187 for (int i = 0; i < size + 2; i++)
188 printf("%c ", '#');
189 printf("\n\n");
190
191 }
192
193 Status Pass(int maze[12][12], PosType CurPos)
194 {
195 if (maze[CurPos.row][CurPos.line] == 0)
196 return OK;
197 else
198 return ERROR;
199 }
200 void Markfoot(int maze[12][12], PosType CurPos)
201 {
202 maze[CurPos.row][CurPos.line] = 1;
203 }
204 PosType NextPos(PosType CurPos, int Dir)
205 {
206 PosType ReturnPos;
207 switch (Dir)
208 {
209 case 1:
210 ReturnPos.row = CurPos.row;
211 ReturnPos.line = CurPos.line + 1;
212 break;
213 case 2:
214 ReturnPos.row = CurPos.row + 1;
215 ReturnPos.line = CurPos.line;
216 break;
217 case 3:
218 ReturnPos.row = CurPos.row;
219 ReturnPos.line = CurPos.line - 1;
220 break;
221 case 4:
222 ReturnPos.row = CurPos.row - 1;
223 ReturnPos.line = CurPos.line;
224 break;
225 }
226 return ReturnPos;
227 }
228 Status InitStack(SqStack &S)
229 {
230 S.base = (SElemType *) malloc(100 * sizeof(SElemType));
231 if (!S.base)return ERROR;
232 S.top = S.base;
233 S.stacksize = 100;
234 return OK;
235 }
236 Status Push(SqStack &S, SElemType &a)
237 {
238 *S.top++ = a;
239 return OK;
240 }
241 Status Pop(SqStack &S, SElemType &a)
242 {
243 if (S.top == S.base)
244 return ERROR;
245 a = *--S.top;
246 return OK;
247 }
248
249 Status StackEmpty(SqStack S)
250 {
251 if (S.top == S.base)
252 return OK;
253 return ERROR;
254 }