夜色阑珊
不乱于心,不困于情.不畏将来,不念过往.如此,安好! 深谋若谷,深交若水.深明大义,深悉小节.已然,静舒! 善宽以怀,善感以恩.善博以浪,善精以业.这般,最佳! 勿感于时,勿伤于怀.勿耽美色,勿沉虚妄.从今,进取! 无愧于天,无愧于地.无怍于人,无惧于鬼.这样,人生!

导航

 
某寺庙里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 }

 

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

posted on 2015-12-13 14:21  夜色阑珊  阅读(242)  评论(0)    收藏  举报