问题: 某厂部班组有6个人,每周每人都要上5天班,而且每人都要连续休息两天?

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	for i := 0; i < 5; i++ {
		p(i)
	}
}

func p(v int) {
	var arr [][]int
	a := []int{1, 1, 1, 1, 1, 1, 1}
	for i := 0; i < 6; i++ {
		b := make([]int, 7, 7)
		copy(b, a)
		b[i] = 0
		b[i+1] = 0
		arr = append(arr, b)
	}
	f, err := os.Create(fmt.Sprintf("E:\\每天%d人排班.txt", v))
	if err != nil {
		return
	}
	defer f.Close()
	w := bufio.NewWriter(f)
	count := 0
	//arrr := make([][][]int, 0, 720)
	dayArr := make([]string, 0, 720)
	for _, i1 := range arr {
		for _, i2 := range arr {
			for _, i3 := range arr {
				for _, i4 := range arr {
					for _, i5 := range arr {
						for _, i6 := range arr {
							a = make([]int, 7, 7)
							for i := 0; i < 7; i++ {
								a[i] = i1[i] + i2[i] + i3[i] + i4[i] + i5[i] + i6[i]
							}
							str := fmt.Sprintf("%d,%d,%d,%d,%d,%d,%d", a[0], a[1], a[2], a[3], a[4], a[5], a[6])
							// 排列中存在等于v天的  存在0~4天,
							flag := true
							for _, i := range a {
								if i == v {
									flag = false
									break
								}
							}
							if flag {
								continue
							}
							// 必须大于等于v天才放行
							for _, i := range a {
								if i < v {
									flag = true
									break
								}
							}
							for _, i := range dayArr {
								if i == str {
									flag = true
									break
								}
							}

							if !flag {
								count++
								dayArr = append(dayArr, str)
								//fmt.Println(a)
								fmt.Printf("输出排法%03d(%v):%v %v %v %v %v %v\n", count, str, i1, i2, i3, i4, i5, i6)
								fmt.Fprintf(w, "输出排法%03d(%v):%v %v %v %v %v %v\n", count, str, i1, i2, i3, i4, i5, i6)
							}
						}
					}
				}
			}
		}
	}
	fmt.Fprintf(w, "共%d种排法", count)
	w.Flush()
}

  

posted @ 2022-03-19 11:57  大道至简,小而蕴真  阅读(135)  评论(0编辑  收藏  举报