您的位置:首页 > 其它

和尚挑水问题

2009-04-04 13:47 337 查看
某寺庙里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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: