某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表:
和尚1: 星期二,四;
和尚2: 星期一,六;
和尚3: 星期三,日;
和尚4: 星期五;
和尚5: 星期一,四,六;
和尚6: 星期二,五;
和尚7: 星期三,六,日;
程序:
//如果某个和尚的挑水日期已经确定,则函数返回这个日期,否则返回-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;
}