zoukankan      html  css  js  c++  java
  • 两个必要张

      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!
    ";
    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:
    ";
    245     cin >> number;
    246     //输入A中的各个元素
    247     cout << "Please Input Each Element Of A:
    ";
    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:
    ";
    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:
    ";
    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:
    ";
    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:
    ";
    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:
    ";
    291     cout << "pi=
    ";
    292     Matrix_Print(pi);
    293     //调用关系矩阵函数
    294     Make_MCC(A, pi, R);
    295     cout << "The Maximal_Consistent_Class Have Been Created As Followed:
    ";
    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):
    ");
     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("找不到通路!
    
    ");
     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:手动创建
    ");
    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结束):
    ", 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 == '
    ')
    137         goto label;
    138     else printf("输入错误!");
    139 }
    140 void printmaze(int maze[12][12], int size)//
    141 {
    142     printf("
    
    ");
    143     printf("显示所建的迷宫(#表示外面的墙):
    ");
    144     for (int i = 0; i < size + 2; i++)
    145         printf("%c ", '#');
    146     printf("
    ");
    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("
    ");
    156     }
    157     for (int i = 0; i < size + 2; i++)
    158         printf("%c ", '#');
    159     printf("
    ");
    160 
    161 }
    162 
    163 void printpath(int maze[12][12], SqStack S, int size)
    164 {
    165     printf("
    
    通路路径为:
    ");
    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("
    ");
    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("
    ");
    186     }
    187     for (int i = 0; i < size + 2; i++)
    188         printf("%c ", '#'); 
    189     printf("
    
    ");
    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 }
  • 相关阅读:
    爬虫-scrapy初试
    python-爬虫day1
    django 内存地址列表-->转换为-->字典
    django 基于 form 验证 确认密码的注册
    django 请求过程,生命周期
    django7 models 高级应用
    django6-项目练习
    Mysql之起始
    python之IO模型
    python模块之Gevent(协程)
  • 原文地址:https://www.cnblogs.com/Zblogs/p/3391440.html
Copyright © 2011-2022 走看看