首页 > 其他 > 详细

和尚挑水

时间:2015-12-13 15:16:38      阅读:229      评论:0      收藏:0      [点我收藏+]
某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表:
和尚1: 星期二,四;
和尚2: 星期一,六;
和尚3: 星期三,日;
和尚4: 星期五;
和尚5: 星期一,四,六;
和尚6: 星期二,五;
和尚7: 星期三,六,日;
请将所有合理的挑水时间安排表 

思路 回朔法求解

回朔法即每进行一步,都试图在当前部分解的基础上扩大该部分解。扩大时,首先检查扩大后是否违反了约束条件,若不违反,则扩大之,然后继续在此基础上按照类似的方法进行,直至成为完整解;若违反,则放弃该步以及它所能生成的部分解,然后按照类似的方法尝试其他可能的扩大方式,直到尝试了所有的扩大方式。

请输入和尚1的空闲时间:0 1 0 1 0 0 0
请输入和尚2的空闲时间:1 0 0 0 0 1 0
请输入和尚3的空闲时间:0 0 1 0 0 0 1
请输入和尚4的空闲时间:0 0 0 0 1 0 0
请输入和尚5的空闲时间:1 0 0 1 0 1 0
请输入和尚6的空闲时间:0 1 0 0 1 0 0
请输入和尚7的空闲时间:0 0 1 0 0 1 1



 1 #include <iostream>
 2 #include <vector>
 3 
 4 using namespace std;
 5 void DrawingWater(char ppFreeDayOfMonk[7][7], int day, int &count, char ppSchema[7][7], bool* visited);
 6 void SearchSchema(char ppFreeDayOfMonk[7][7], int * pSchemaNum, char ppSchema[7][7]);
 7 void getFreeMonkByDay(int day, int* monkNum, int* monkId);
 8 
 9 char ppFreeDayOfMonk[7][7] = {
10     { 0,1,0,1,0,0,0 },
11     { 1,0,0,0,0,1,0 },
12     { 0,0,1,0,0,0,1 },
13     { 0,0,0,0,1,0,0 },
14     { 1,0,0,1,0,1,0 },
15     { 0,1,0,0,1,0,0 },
16     { 0,0,1,0,0,1,1 },
17 };
18 
19 void getFreeMonkByDay(int day, int* monkNum, int* monkId)
20 {
21     for (int i = 0; i<7; i++)
22     {
23         if (ppFreeDayOfMonk[i][day] == 1)
24         {
25             monkId[*monkNum] = i;
26             (*monkNum)++;
27         }
28     }
29 }
30 
31 void SearchSchema( char ppFreeDayOfMonk[7][7], int * pSchemaNum, char ppSchema[7][7])
32 {
33     bool visited[7] = { false,false, false, false, false, false, false };
34 
35     DrawingWater(ppFreeDayOfMonk, 0, *pSchemaNum, ppSchema, visited);
36 
37 }
38 
39 void DrawingWater( char ppFreeDayOfMonk[7][7], int day, int &count, char ppSchema[7][7], bool* visited) 
40 {
41     static char week[7] = { 0 };
42     int i;
43     if (day == 7) 
44     {
45         for (int index = 0; index < 7; index++)
46         {
47             ppSchema[count][index] = week[index];
48         }
49         ++count;
50         return;
51     }//if
52     for (i = 0; i < 7; ++i) {
53         week[day] = i+0;
54         if ( !visited[i])
55         {
56             if (ppFreeDayOfMonk[i][day] == 1)
57             {
58                 visited[i] = true;
59                 DrawingWater(ppFreeDayOfMonk, day + 1, count, ppSchema, visited);
60                 visited[i] = false;
61             }
62         }//if
63     }//for
64 }
65 
66 int main()
67 {
68     int pSchemaNum = 0;
69     char ppSchema[7][7] = { 0 };
70     SearchSchema(ppFreeDayOfMonk, &pSchemaNum, ppSchema);
71     cout << pSchemaNum << endl;
72     for (int i = 0; i < pSchemaNum; i++)
73     {
74         for (int j = 0; j < 7; j++)
75         {
76             cout << (char)(ppSchema[i][j]+1);
77         }
78         cout << endl;
79     }
80     char pause;
81     cin >> pause;
82     return 0;
83 }

 

算法很简单,但是竟然被二维数组指针传递的问题搞蒙了。。。之后有时间再补发个指针形参的学习记录

和尚挑水

原文:http://www.cnblogs.com/night-dim-light/p/5042680.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!