H公司线上笔试题:和尚挑水方案

描述:
某寺庙里7个和尚每天轮流挑水,每个人可以挑水的日期是固定的
例如:
和尚1: 星期二,四;
和尚2: 星期一,六;
和尚3: 星期三,日;
和尚4: 星期五
和尚5: 星期一,四,六;
和尚6: 星期二,五;
和尚7, 星期三,六,日。
需要给出所有的挑水方案。
运行时间限制: 无限制
内存限制: 无限制
输入:
7个和尚的可以挑水的日期。一个7*7二维数组数组,数组值为1表示和尚当天可以挑水,值为0表示当天不能挑水。
输出:
挑水方案总数
生成的挑水方案
如输入:{ {0, 1, 0, 1, 0, 0, 0}, {1, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 0, 1},
{0, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 1, 0, 1, 0}, {0, 1, 0, 0, 1, 0, 0},
{0, 0, 1, 0, 0, 1, 1} };
应可生成4种方案。
方案按到星期1,星期2….星期7的和尚序号(和尚序号从1开始)升序排列。
方案1: 星期1和尚2挑水,星期2和尚6挑水,星期3和尚3挑水,星期4和尚1挑水,星期5和尚4挑水,星期6和尚5挑水,星期天和尚7挑水。
方案2: 星期1和尚2挑水,星期2和尚6挑水,星期3和尚7挑水,星期4和尚1挑水,星期5和尚4挑水,星期6和尚5挑水,星期天和尚3挑水。
方案3: 星期1和尚5挑水,星期2和尚6挑水,星期3和尚3挑水,星期4和尚1挑水,星期5和尚4挑水,星期6和尚2挑水,星期天和尚7挑水。
方案4: 星期1和尚5挑水,星期2和尚6挑水,星期3和尚7挑水,星期4和尚1挑水,星期5和尚4挑水,星期6和尚2挑水,星期天和尚3挑水。
样例输入:
0 1 0 1 0 0 0
1 0 0 0 0 1 0
0 0 1 0 0 0 1
0 0 0 0 1 0 0
1 0 0 1 0 1 0
0 1 0 0 1 0 0
0 0 1 0 0 1 1
样例输出:
4
2 6 3 1 4 5 7
2 6 7 1 4 5 3
5 6 3 1 4 2 7
5 6 7 1 4 2 3
答案提示:

解题思路:维护空闲数组,7天遍历寻找可以打水的人,找到一个,就把这个人的时间表变成全零,进行下一天的递归。把每一天的所有可以取的人都进行尝试。每次当选择到第7天,就把当前安排表压入容器,之后统一管理输出。

#include
#include
using namespace std;
int line[7];
vectorsum;
void findsch(int **map,int n)
{
if(n == 7)
{
int *templine = new int[7];
for(int i = 0 ; i < 7;i++) { templine[i] = line[i]; } sum.push_back(templine); return; } for(int i = 0; i < 7;i++) { if(map[i][n] == 1) { int * temp[7]; for(int k = 0;k < 7;k++) { temp[k] = new int[7]; } for(int k = 0;k <7;k++) for(int j = 0 ; j < 7;j++) { temp[k][j]=map[k][j]; } for(int k = 0 ; k < 7;k++) { temp[i][k] = 0; } line[n]=i+1; findsch(temp, n+1); } } } int main() { int * map[7]; for(int i = 0;i < 7;i++) { map[i] = new int[7]; } for(int i = 0;i <7;i++) for(int j = 0 ; j < 7;j++) { cin>>map[i][j];
}
findsch(map,0);
cout<

发表评论