青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

題目描述如下:

ABCDE五人安排工作日程,每人每星期工作5天休息2

1)        必須有3天所有人都要上班

2)        每個人連續上班不超過3天,周日到周一是連續工作

3)        A、C星期三必須上班

4)        BD、E星期天都不上班

5)        AC一星期至少見4

6)        A、BC、D中每天必須至少有2人上班

輸出所有從星期一到星期天可能的情況,每種情況間用空行隔開,0代表不上班,1代表上班。

例:

1 0 1 1 1 0 1

1 1 0 1 1 1 0

1 0 1 1 1 0 1

1 1 0 1 1 1 0

1 1 0 1 1 1 0

 

結題思路:

題目的每個解是一個5*701矩陣,枚舉每一個矩陣,然后用題目所給的條件判定即可,時間復雜度為O(2^35),明顯超時。結合題目條件“每人每星期工作5天休息2”,我們可以完成初步剪枝:對每個人的工作表,可以看成在五個1中插入兩個00的具體位置可以看成一個組合問題,既是在6個位置中選擇兩個位置(這里已經排除兩個0相鄰的情況,因為條件2)。這樣,題目的復雜度為O((C26)^5),相當小啦。除了條件1,其余的條件判斷均可在排列過程中進行,作為剪枝只用。

 

 代碼如下:

 


public class Main {
    
    
    
static int mp[][] = new int[5][7];
    
static int count;
    
static int num[][] = {
        
{012345},
        
{012345},
        
{012345},
        
{012345},
        
{012345}    
        
/*
         * 每個員工使用num[][]的一行完成組合,
         * 避免別的員工組合計算時的殘留值
         
*/

    }
;
    
public static void main(String[] args) {
        count 
= 0;
        DFS(
000);
        System.out.println(
"count=" + count);
        
for(int i = 0; i < num.length; i++){
            
for(int n : num[i])
                System.out.print(n 
+ " ");
            System.out.print(
"\n");
        }

        
    }

    
static void outmp(){
        System.out.println();
        
for(int i = 0; i < 5; i++){
            
for(int j = 0; j < 7; j++)
                System.out.print(mp[i][j] 
+ " ");
            System.out.println();
        }

    }

    
static void DFS(int c, int nowp, int left){
        
/*
         * c,當前員工(0,1,2,3,4)
         * nowp,left用于計算組合
         
*/

        
if(c >= 5){
            
if(R1()){
                outmp();
                count
++;
            }

            
return;
        }

        
if(nowp == 2){
            makemp(c, num[c][
0], num[c][1]);
            
if(!R2(c))//R2
                return;
            
if(c == 0 && mp[0][2!= 1)//R3
                return;
            
if(c == 2 && mp[2][2!= 1)
                
return;
            
if(c == 1 && mp[1][6!= 0)//R4
                return;
            
if(c == 3 && mp[3][6!= 0)
                
return;
            
if(c == 4 && mp[4][6!= 0)
                
return;
            
if(c == 2 && !R5())//R5
                return;
            
if(c == 3 && !R6())//R6
                return;
            
            DFS(c 
+ 100);
        }

        
else{
            
for(int i = left; i < num[0].length; i++){
                swap(num[c], nowp, i);
                DFS(c, nowp 
+ 1, i + 1);
                swap(num[c], nowp, i);
            }

        }

    }

    
static void makemp(int c, int a, int b){
        
for(int i = 0; i < a; i++)
            mp[c][i] 
= 1;
        mp[c][a] 
= 0;
        
for(int i = a + 1; i <= b; i++)
            mp[c][i] 
= 1;
        mp[c][b 
+ 1= 0;
        
for(int i = b + 2; i < 7; i++)
            mp[c][i] 
= 1;
    }

    
static boolean R1(){
        
int count = 0
        
for(int i = 0; i < 7; i++){
            
if(chechRol(i))
                count
++;
        }

        
if(count >= 3)
            
return true;
        
return false;
    }

    
static boolean chechRol(int r){
        
for(int i = 0; i < 5; i++)
            
if(mp[i][r] != 1)
                
return false;
        
return true;
    }

    
static boolean R2(int c){//one person
        int count = 0;
        
boolean bg = false;
        
for(int i = 0; i < 7; i++){
            
if(mp[c][i] != 0){
                
if(bg == false){
                    count 
= 1;
                    bg 
= true;
                }

                
else{
                    count
++;
                    
if(count > 3)
                        
return false;
                }

            }

            
else{
                bg 
= false;
            }

        }

        
return true;
    }

    
static boolean R5(){
        
int count = 0;
        
for(int i = 0; i < 7; i++){
            
if(mp[0][i] == 1 && mp[2][i] == 1)
                count
++;
        }

        
if(count >= 4)
            
return true;
        
return false;
    }

    
static boolean R6(){
        
int count = 0;
        
for(int i = 0; i < 7; i++){
            count 
= 0;
            
for(int j = 0; j < 5; j++)
                
if(mp[j][i] == 1)
                    count
++;
            
if(count < 2)
                
return false;
        }

        
return true;
    }

    
static void swap(int a[], int n, int m){
        
int t = a[n];
        a[n] 
= a[m];
        a[m] 
= t;
    }

}

 

posted on 2013-07-06 15:43 小鼠標 閱讀(242) 評論(0)  編輯 收藏 引用 所屬分類: Java基礎練習
<2013年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

隨筆分類(111)

隨筆檔案(127)

friends

最新評論

  • 1.?re: 線段樹
  • 是這個樣子的,所以在OJ有時候“卡住”了也不要太灰心,沒準真的不是自己的原因呢。
    加油,祝你好運啦!
  • --小鼠標
  • 2.?re: 線段樹
  • 對于編程競賽來說,Java所需時間一般為C/C++的兩倍。合理的競賽給Java的時間限制是給C/C++的兩倍。
  • --傷心的筆
  • 3.?re: poj1273--網絡流
  • 過來看看你。
  • --achiberx
  • 4.?re: (轉)ubuntu11.10無法啟動無線網絡的解決方法
  • 膜拜大神。。查了一個下午資料終于在這里解決了問題。。神牛說的區域賽難道是ACM區域賽。。?
  • --Hang
  • 5.?re: 快速排序、線性時間選擇
  • 博主,謝謝你的文章。你的方法可以很好的處理分區基準在數組中重復的情況,書上的方法遇到這種輸入會堆棧溢出。書上給出了解釋但給的方法貌似不簡潔。
  • --lsxqw2004

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线午夜精品自拍| 99riav1国产精品视频| 欧美一区二区大片| 中文精品在线| 亚洲专区在线| 新67194成人永久网站| 销魂美女一区二区三区视频在线| 亚洲午夜av在线| 国产欧美日韩免费看aⅴ视频| 欧美成人综合| 久久久久久香蕉网| 久久综合色一综合色88| 欧美国产日韩一区二区| 欧美精品一区三区在线观看| 欧美日韩在线大尺度| 国产精品久久久久久久久久直播 | 久久男人资源视频| 久久亚洲国产成人| 欧美理论在线| 国产一二精品视频| 伊人成综合网伊人222| 亚洲精品日韩精品| 亚洲欧美影院| 老司机67194精品线观看| 91久久中文| 一区二区三区精品视频| 欧美一区二区三区成人| 免费成人黄色| 国产精品日韩欧美一区| 在线观看亚洲专区| 亚洲午夜女主播在线直播| 久久精品一本| 日韩视频一区二区在线观看 | 麻豆成人在线| 夜夜嗨av一区二区三区四区| 欧美在线999| 欧美日本一区| 亚洲福利av| 性久久久久久久久久久久| 欧美大片一区| 午夜在线视频观看日韩17c| 欧美va天堂在线| 国外成人在线视频| 亚洲欧美日韩另类精品一区二区三区| 麻豆久久精品| 亚洲一区综合| 欧美日韩视频在线观看一区二区三区 | 亚洲日本一区二区三区| 久久精品在线免费观看| 99国产精品久久久| 女人天堂亚洲aⅴ在线观看| 国产精品免费网站| 欧美黑人在线观看| 午夜精品久久久久久| 欧美日韩国产综合新一区| 亚洲成人在线免费| 久久久999| 午夜伦理片一区| 国产精品久久国产精麻豆99网站| 亚洲国产精品激情在线观看| 久久精品亚洲乱码伦伦中文| 日韩午夜av| 欧美日韩精品免费观看视频| 亚洲日韩成人| 亚洲国产精品久久久久婷婷884 | 欧美午夜宅男影院| av成人天堂| 亚洲激情视频在线播放| 欧美mv日韩mv亚洲| 亚洲麻豆视频| 亚洲精品视频啊美女在线直播| 蜜臀a∨国产成人精品 | 亚洲黄网站在线观看| 欧美成黄导航| 免费看的黄色欧美网站| 亚洲精品永久免费| 日韩亚洲欧美成人一区| 国产精品成人va在线观看| 亚洲欧美999| 午夜国产精品视频免费体验区| 国产亚洲人成网站在线观看| 久久精品123| 久久久夜夜夜| 日韩午夜剧场| 在线亚洲国产精品网站| 国产精品视频一区二区高潮| 久久精品卡一| 免费不卡在线观看| 亚洲一区二区在线免费观看视频| 亚洲午夜免费福利视频| 国产主播一区| 亚洲欧洲一区| 国产免费成人av| 欧美成年人视频网站| 欧美日韩亚洲一区二区三区在线观看 | 欧美精品一二三| 香港久久久电影| 久久久水蜜桃| 正在播放亚洲| 久久久www成人免费毛片麻豆| 91久久国产综合久久91精品网站| 日韩一区二区电影网| 国产在线视频欧美| 亚洲精品老司机| 国产亚洲欧美日韩美女| 欧美成人有码| 国产精品羞羞答答| 亚洲电影免费观看高清完整版在线观看 | 国产亚洲永久域名| 亚洲人精品午夜| 国产亚洲欧美一区在线观看| 亚洲黄色大片| 国产一区二区精品在线观看| 亚洲日本成人| 在线免费高清一区二区三区| 在线一区日本视频| 亚洲国产精品综合| 亚洲欧美日韩精品在线| 一区二区免费看| 亚洲欧美日产图| 一区二区三区av| 久久综合九色99| 久久精品亚洲热| 国产精品视频xxxx| 亚洲肉体裸体xxxx137| 一区二区在线看| 性欧美超级视频| 午夜精彩视频在线观看不卡| 欧美连裤袜在线视频| 免费一级欧美片在线播放| 国产精品综合久久久| 日韩一区二区高清| 99亚洲伊人久久精品影院红桃| 久久99伊人| 久久久久久亚洲精品中文字幕| 国产精品久久久久国产精品日日 | 91久久精品一区| 久久久成人精品| 蜜臀a∨国产成人精品| 黄色成人91| 欧美专区福利在线| 久久偷窥视频| 亚洲国产精品传媒在线观看| 美女网站在线免费欧美精品| 欧美黄色视屏| 一本色道久久综合亚洲精品不卡| 欧美精品二区三区四区免费看视频| 欧美激情第五页| 一本一本久久a久久精品综合麻豆| 欧美精品尤物在线| 一个色综合导航| 欧美一区在线看| 在线观看一区视频| 欧美精品成人| 亚洲综合成人婷婷小说| 久久久精品日韩| 亚洲电影网站| 欧美性猛交xxxx乱大交蜜桃| 亚洲视频免费在线| 久久精品人人做人人爽| 亚洲国产精品成人va在线观看| 欧美激情亚洲另类| 亚洲视频在线观看免费| 免费久久久一本精品久久区| 亚洲精品久久久久久久久久久久 | 免费国产自线拍一欧美视频| 欧美日韩免费视频| 老色批av在线精品| 亚洲精一区二区三区| 另类尿喷潮videofree | 亚洲电影免费观看高清完整版| 久久蜜臀精品av| 亚洲人成在线观看网站高清| aaa亚洲精品一二三区| 欧美日韩国产另类不卡| 日韩视频免费| 蜜臀av性久久久久蜜臀aⅴ| 亚洲国产精品www| 欧美精品自拍| 亚洲午夜精品久久久久久浪潮| 老司机精品导航| 亚洲精品日本| 国产精品嫩草99av在线| 亚洲人成亚洲人成在线观看图片 | 久久午夜视频| 一区二区电影免费在线观看| 国产精品久久影院| 午夜在线视频一区二区区别| 你懂的视频欧美| 欧美在线视频不卡| **网站欧美大片在线观看| 欧美屁股在线| 欧美一区国产二区| 99re这里只有精品6| 欧美亚洲日本网站| 在线观看亚洲| 久久久久国色av免费看影院| 亚洲一线二线三线久久久| 免费影视亚洲| 小嫩嫩精品导航|