和尚挑水问题
2009-04-04 13:47
337 查看
某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表:
和尚1: 星期二,四;
和尚2: 星期一,六;
和尚3: 星期三,日;
和尚4: 星期五;
和尚5: 星期一,四,六;
和尚6: 星期二,五;
和尚7: 星期三,六,日;
程序:
和尚1: 星期二,四;
和尚2: 星期一,六;
和尚3: 星期三,日;
和尚4: 星期五;
和尚5: 星期一,四,六;
和尚6: 星期二,五;
和尚7: 星期三,六,日;
程序:
#include <iostream> using namespace std; //如果某个和尚的挑水日期已经确定,则函数返回这个日期,否则返回-1 inline int MonkConfirm(int x[7]) { int count = 0, t = -1; for (int i = 0; i < 7; i++) { if (x[i] == 1) { count++; t = i; } } //和尚的备选日期只有一个,则说明他的挑水日期已经确定了 return count == 1 ? t : -1; } int main() { int a[7][7];//如果(a[i][j]==1) 则表示星期j为第i个和尚的备选日期 memset(a, 0, sizeof a); a[0][2] = a[0][4] = 1; //和尚: 星期二,四; a[1][1] = a[1][6] = 1; //和尚: 星期一,六; a[2][3] = a[2][0] = 1; //和尚: 星期三,日; a[3][5] = 1; //和尚: 星期五; a[4][1] = a[4][4] = a[4][6] = 1; //和尚: 星期一,四,六; a[5][2] = a[5][5] = 1; //和尚: 星期二,五; a[6][3] = a[6][6] = a[6][0] = 1; //和尚: 星期三,六,日; bool tag = true; int i, j, x; while (tag) { for (i = 0; i < 7; i++) { cout << "和尚" << i << "的挑水日期是星期"; for (j = 0; j < 7; j++) if (a[i][j] > 0) cout << j; cout << endl; } cout << endl; tag = false; for (i = 0; i < 7; i++) { if ((x = MonkConfirm(a[i])) > 0) {//第i个和尚的日期已经确定为星期x了 for (j = 0; j < 7; j++) { if ((j != i) && (a[j][x] == 1)) { a[j][x] = 0;//所有和尚的备选日期中去掉星期x tag = true; } } // a[i][x] = 1;//他的备选日期中可不能去掉星期x ^_^ } } // tag = false; // // for (i = 0; i < 7; i++) // { // if ((x = MonkConfirm(a[i])) > 0) // { // tag = true;//又一个和尚的挑水日期被确定了 // } // } } //假定答案是唯一的 return 0; }