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