亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

枚舉的應用:熄燈問題&討厭的青蛙

2019-11-11 06:06:12
字體:
來源:轉載
供稿:網友
1.枚舉的基本思想1.枚舉應用舉例:Q:尋找小于N的最大素數(素數(質數):除了1和本身,不能被其他數整除的數)N-1?     N-2?     N-3...2.枚舉的定義:從可能的答案中有規律地一一地去列舉猜測(檢驗)。3.枚舉技巧:1.減小搜索空間,及早排除錯誤的答案(例如偶數不可能是素數,所以枚舉素數要在奇數中找)2.縮小變量空間,盡量減小規模(原版:素數不能被整數整除-->優化版:素數不能被其他素數整除(不包括1和本身))3.合適的搜索順序,這個順序的選擇要看條件,例如最大數還是最小數。2.熄燈問題1.題目當按下一個按鈕后, 該按鈕以及周圍位置(上邊, 下邊, 左 邊, 右邊)的燈都會改變一次( 如果燈原來是點亮的, 就會被熄滅)同時按幾個按鈕效果就會相互抵消問題: 請你寫一個程序, 確定需要按下哪些按鈕, 恰好使得所 有的燈都熄滅2.解題1.輸入     要解決的案例數     0 1 0 1...燈情況(1亮起,0不亮)2.輸出     0 1 0 1...操作情況(1按下,0不按)3.分析     不同行的燈可以相互影響,          對第1行中每盞點亮的燈, 按下第2行對應的按鈕, 就 可以熄滅第1行的全部燈          如此重復下去, 可以熄滅第1, 2, 3, 4行的全部燈     第一想法:將所有按鈕狀態一一枚舉,判斷最后是否全滅  (但是可能性有2^30可能,會超時)     燈最后的是亮是按取決于兩個因素:1.當前行的按鈕情況     2.下一行的按鈕情況其他行根本就不會影響當前行的燈,所以第一行的按鈕是沒法預測的(隨機的),當第一行的按鈕情況確定之后,下一行就是唯一的了,依次類推下下行也是唯一的。所以我們要遍歷的就是第一行的隨機情況。     而判斷是否全滅,就是當最后一行熄滅了前一行的所有燈之后,最后一行如果剛好全滅,說明所有的燈都熄滅了。否則第一行就得換狀態。     第二想法:將第一行可能性枚舉,下一行將固定,判斷最后一行是否剛好全滅。(第一行的可能性:2^6=64)     優化想法:按列來枚舉(第一行的可能性:2^5=32)4.具體實現     1.做兩個數組,數組A用來表示燈亮顯示,數組B用來表示按鈕操作。     2.用六重循環,遍歷第一行的每個數的兩種可能。(想要簡介的話,把第一行看做6位的二進制來算:用while來形成二級制的規律,嘗試一下)     3.優化過程:解決0坐標開始和最后一個結束的問題,設立不用0坐標和最后一個的數組     4.判斷這個燈亮不亮:取決于上面的燈處理之后的狀態,而上面的燈的處理需要左右上的按鈕和本身狀態決定(除了第一行是隨機的),所以用上面的四個影響因素(左右上的按鈕和本身狀態)加起來,如果是偶數,效果抵消,值為0。(所以用%計算)     5.當所有的數組存好之后,取出最后一列的上左右中按鈕情況,判斷與之前燈亮的關系,如果兩者不相等,說明最終燈的狀態是亮的,一旦有亮的出現,馬上返回錯誤。(把核心步驟裝到一個方法中)4.小結思路A獲取燈亮情況調用B方法,枚舉出不同的第一行輸出所得到的數組B二進制的枚舉第一行操作情況調用C方法,把枚舉值傳過去,根據返回結果,更換第一行C通過第一行獲取其他行的操作情況驗證最后一行與與燈亮的關系是否為燈滅,返回結果5.java代碼實現package Test;import java.util.Scanner;/*枚舉   熄燈問題 * 當按下一個按鈕后, 該按鈕以及周圍位置(上邊, 下邊, 左 邊, 右邊)的燈都會改變一次( 如果燈原來是點亮的, 就會被熄滅) * */public class Test {     //檢測排錯?。。tatic int light[][]=new int[6][8];   //燈亮情況數組5行6列去外圍(左右頭尾);static int PRess[][]=new int[6][8];   //燈亮情況數組5行6列去外圍(左右頭尾);public static void main(String[] args) {//   A/* * 測試數據: *0 1 1 0 1 01 0 0 1 1 10 0 1 0 0 11 0 0 1 0 10 1 1 1 0 0*/     System.out.println("請輸入燈亮情況");     Scanner input=new Scanner(System.in);     //獲取輸入數組:燈亮情況     for(int i=1;i<light.length;i++){   //行           for(int j=1;j<light[i].length-1;j++){   //列                light[i][j]=input.nextInt();           }     }     System.out.println("輸入完畢");     //調用B方法,枚舉出不同的第一行     if(FirstRow()){           //   輸出所得到的數組           for(int i=1;i<press.length;i++){   //行                for(int j=1;j<press[i].length-1;j++){   //列                     System.out.print(press[i][j]+" ");                }                System.out.println();   //換行           }     }else{           System.out.println("找不到解法");     }}//首行隨機數方法static boolean FirstRow(){//B//二進制轉換器     for(int i=0;i<light.length;i++){   //行           for(int j=0;j<light[i].length;j++){   //列                press[i][j]=0;      //初始化所有按鈕為0,包括外圍           }     }//調用C方法,把枚舉值傳過去,根據返回結果,更換第一行     while(!guess(press)){    //執行結果不正確時           press[1][1]++;           int c=1;  //指向的數           while(press[1][c]>1){    //檢驗進位器:從第一位開始檢查,一大于1就進一位                press[1][c]=0;                c++;                press[1][c]++;                if(press[1][press[1].length-2]>1){   //說明都超位了還找不到                     return false;   //找不到了                }           }     }     return true;  //找到了按鈕}static boolean guess(int press[][]) {     //C     //通過第一行獲取其他行的操作情況     for(int i=2;i<press.length;i++){    //從第二列到最后一列           for(int j=1;j<press[i].length-1;j++){   //該列的每一項                press[i][j]=(light[i-1][j]+press[i-1][j]+press[i-1][j-1]+press[i-1][j+1]+press[i-2][j])%2;     //該項的按鈕操作情況取決于上個按鈕操作后的情況           }     }     //驗證最后一行與與燈亮的關系是否為燈滅,返回結果     for(int i=1;i<press[press.length-1].length-1;i++){          if((press[press.length-1][i]+press[press.length-1][i-1]+press[press.length-1][i+1]+press[press.length-2][i])%2!=light[press.length-1][i]){   //不相等說明最后亮                return false;           }     }     return true;}}3.討厭的青蛙1.題目1.直線路徑:每只青蛙總是沿著一條直線跳躍稻田2.相同間距:且每次跳躍的距離都相同3.有進有出:而青蛙總是從稻田的一側跳進稻田, 然后沿著某條直線穿 越稻田, 從另一側跳出去4.多項干擾:可能會有多只青蛙從稻田穿越問題: 在各條青蛙行走路徑中, 踩踏水稻最多的那一條上, 有多 少顆水稻被踩踏2.解題1.輸入     6 7    //6行7列     14    //被踩的數量14棵     2     1          //稻子的坐標     3     4     5     3...   (總共14個)2.輸出     7     (單只青蛙踩最多的步數,沒有輸出為0)3.分析     第一想法:枚舉每一條路徑的情況, 起點可能性*方向可能性*步長可能性=非常多(不可?。┊斘覀兇_定的想法為前兩個的時候,我們就可以確定步長,步長有兩個,dX是X方向上,dY是Y方向上。確定了步長就可以減少:1.前面需要超過稻田    2.后面沒有超過稻田     第二想法:枚舉兩個點的組合,判斷這兩個點能不能成立。成立的話計算最多步數。首先獲取行列,稻子坐標,然后排序稻子大小,排序方式我本來是想用ArrayList來存坐標對象,但是這樣做得手動進行位置交換,所以我就想到用TreeSet的方式,這樣就可以自動排序。接下來就對稻子進行一一組合,組合后有一些組合根本就不能存在,像第一步前一步如果在稻田里的話(需要判斷XY,continue掉),還有就是設立最大步數(初始化為2),如果(最大步數-1)步的時候到了稻田外(需要判斷兩個,X判斷break,Y判斷continue,因為包含的關系),那也不行。調用步長方法:從這點觸發,傳dX,dY,能夠走幾步,將返回的步數賦給最多步最后判斷最多步如果為2,則歸為0步長方法添加步長,添加步數做while循環,做判斷坐標沒有越界,就不斷添加步數4.小結思路A獲取行列數,被踩數量,稻子坐標(坐標用對象的方式實現,新建一個類)調用B方法,排序稻子坐標循環x,y坐標,一個個組合,判斷組合如果符合條件     當第一步減去步長大于1 大于1與小于稻田長寬,跳過這次循環     當第一步X+最大步數(-1)*步長如果越界,跳過整個循環     當第一步Y+最大步數(-1)*步長如果越界,跳過這次循環(因為屬于子類)調用C方法,獲取最大步數判斷最大步數為2,則歸為0BX從小到大,Y從小到大C初始化步數為2,第一步變為第二步(XY)做while循環,當變化后的xy沒有超過稻田,就不斷把步數加上去最終返回最大步數5.代碼實現package Test;import java.util.ArrayList;import java.util.Iterator;import java.util.Scanner;import java.util.TreeSet;public class Test {     static int c;     static int r;     static ArrayList<Sign> al;     public static void main(String[] args) {           int max=2;      //定義最大步數為2//         A//         獲取行列數,被踩數量,稻子坐標(坐標用對象的方式實現,新建一個類)           System.out.println("請輸入行,列,被踩稻子數:");           @SuppressWarnings("resource")           Scanner input=new Scanner(System.in);           r=input.nextInt();           c=input.nextInt();           int desNum=input.nextInt();   //被踩稻子數           System.out.println("請輸入被踩稻子的坐標:");           //記錄稻子坐標           TreeSet<Sign> ts=new TreeSet<Sign>(); //用TreeSet的自動排序           for(int i=0;i<desNum;i++){                ts.add(new Sign(input.nextInt(), input.nextInt()));   //y&x           }           al=new ArrayList<Sign>();           //將TreeSet轉存到ArrayList           Iterator<Sign> it=ts.iterator();           while(it.hasNext()){                al.add(it.next());           }//         循環坐標,一個個組合,判斷組合如果符合條件           for(int i=0;i<al.size();i++){                for(int j=i+1;j<al.size();j++){      //組合跟順序無關,所以用i+1                     int dX=al.get(j).x-al.get(i).x;      //xd:x的跨距,后面的減前面的                     int dY=al.get(j).y-al.get(i).y;                     int pX=al.get(i).x-dX;     //得到第一步的前一步,用于驗證                     int pY=al.get(i).y-dY;//                   當第一步減去步長大于1 大于1與小于稻田長寬,跳過這次循環                     if(pX>=1&&pY>=1){   //前一步在田里面                           continue;  //跳過這一次循環                     }//                   當第一步X+最大步數(-1)*步長如果越界,跳過整個循環                     if(al.get(i).x+(max-1)*dX>r){   //判斷如果加上最大步就超過田,跳過循環i                           break;                     }//                   當第一步Y+最大步數(-1)*步長如果越界,跳過這次循環(因為屬于子類)                     if(al.get(i).y+(max-1)*dY>c){                           continue;                     }//                   調用B方法,獲取最大步數                     int step=Step(al.get(i),dX,dY);                     if(step>max){   //步數超過的記錄起來                           max=step;                     }                }           }//         判斷最大步數為2,則歸為0           if(max==2){                max=0;           }           System.out.println(max);     }//獲取最大步數     private static int Step(Sign step,int dX,int dY){//         B//         做while循環,當變化后的xy沒有超過稻田,就不斷把步數加上去           int max=0;           int x=step.x;  //不能用對象,對象只是地址符,重量級           int y=step.y;           while(x<=c&&y<=r){         //判斷沒有超出田地時,可以等于田地。注意邊緣數據                //判斷是不是踩倒的稻草                if(!isDao(y,x)){   //新產生的對象不能和舊的比較                     max=0;                     break;                }                x+=dX;                y+=dY;                max++;   //加1次就多一步,但是最后一次是在田外的,所以抵消第一步           }//         最終返回最大步數           return max;     }//判斷是不是踩倒     private static boolean isDao(int y,int x){           boolean flag=false;           for(int i=0;i<al.size();i++){                if(al.get(i).y==y){                     if(al.get(i).x==x){                           flag=true;                     }                }           }           return flag;     }}//新建坐標類class Sign implements Comparable<Sign>{     //繼承Comparable對數據進行比較     int x;     int y;     Sign(int y,int x) {    //構造方法賦值           this.x=x;           this.y=y;     }     @Override    //定義排序規則     public int compareTo(Sign o) {           if(this.x>o.x){                return 1;           }else if(this.x<o.x){                return -1;           }else{                if(this.y>o.y){                     return 1;                }else if(this.y<o.y){                     return -1;                }else{                     return 0;                }           }     }}資料來自:https://www.coursera.org/learn/suanfa-jichu/lecture/rfoj5/mei-ju-de-ji-ben-si-xiang
上一篇:shell學習 文件表達式

下一篇:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久91精品国产91久久久| 日本精品久久中文字幕佐佐木| 韩国精品美女www爽爽爽视频| 国产69久久精品成人看| 国产成人精品亚洲精品| 亚洲国产精品久久久久秋霞不卡| 精品夜色国产国偷在线| 国产91精品久久久久| 在线视频欧美日韩| 久久国产精品视频| 在线播放精品一区二区三区| 国产亚洲免费的视频看| 精品国产一区二区三区久久狼黑人| 91精品国产综合久久香蕉最新版| 亚洲欧洲自拍偷拍| 成人精品网站在线观看| 成人h片在线播放免费网站| 98视频在线噜噜噜国产| 一本一本久久a久久精品牛牛影视| 久久久人成影片一区二区三区| 色偷偷av亚洲男人的天堂| 日韩欧美亚洲国产一区| …久久精品99久久香蕉国产| 亚洲色图在线观看| 成人福利在线视频| 亚洲精品美女久久久久| 国产亚洲精品美女久久久| 久操成人在线视频| 亚洲成人久久一区| 久久久久久国产精品久久| 精品久久久香蕉免费精品视频| 97香蕉久久夜色精品国产| 日韩中文字幕免费看| 中文国产成人精品| 欧美激情视频一区二区| 91极品女神在线| 日韩免费精品视频| 日韩大胆人体377p| 欧美精品一区在线播放| 欧美午夜精品久久久久久浪潮| 亚洲跨种族黑人xxx| 国模极品一区二区三区| 亚洲毛片在线观看.| 欧美激情网站在线观看| 精品视频一区在线视频| 性亚洲最疯狂xxxx高清| 国产亚洲精品久久久久久777| 97在线视频观看| www高清在线视频日韩欧美| 欧美精品电影免费在线观看| 日本精品免费一区二区三区| 国产日韩欧美另类| 爽爽爽爽爽爽爽成人免费观看| 国产精品夜色7777狼人| 秋霞成人午夜鲁丝一区二区三区| 成人免费福利视频| 欧美视频裸体精品| 中文字幕v亚洲ⅴv天堂| 欧美激情在线视频二区| 在线观看欧美日韩国产| 亚洲欧洲在线播放| 午夜精品国产精品大乳美女| 久久久视频精品| 亚洲九九九在线观看| 亚洲福利在线视频| 懂色av中文一区二区三区天美| 欧美成人激情视频免费观看| 亚洲深夜福利视频| 精品色蜜蜜精品视频在线观看| 亚洲综合一区二区不卡| 亚洲欧洲国产精品| 国产精品1234| 国产精品久久久久久网站| 中文字幕国产亚洲2019| 国产亚洲欧洲黄色| 亚洲免费伊人电影在线观看av| 亚洲精品一区av在线播放| 国产精品福利在线观看| 国产欧美在线视频| 国产在线999| 中文字幕亚洲自拍| 国产午夜精品理论片a级探花| 亚洲精品国产精品国自产在线| 国产日韩欧美中文在线播放| 久久精品99久久久久久久久| 69国产精品成人在线播放| 成人性生交大片免费看小说| 疯狂欧美牲乱大交777| 日韩精品亚洲视频| 中文字幕亚洲一区二区三区五十路| 欧美激情欧美激情| 97人人爽人人喊人人模波多| 日韩最新av在线| 91视频国产精品| 自拍偷拍亚洲区| 国产精品高潮呻吟久久av野狼| 日韩免费观看视频| 不卡av在线播放| 成人xvideos免费视频| 国产91在线高潮白浆在线观看| 国产视频综合在线| 欧美大胆在线视频| 国产精品欧美一区二区三区奶水| 久久噜噜噜精品国产亚洲综合| 欧美一级免费看| 欧美性受xxx| 国产精品a久久久久久| 色综合五月天导航| 黄网站色欧美视频| 亚洲色图综合网| 久久精品亚洲热| 亚洲成av人乱码色午夜| 亚洲欧美日韩国产中文| 97香蕉久久夜色精品国产| 91精品国产九九九久久久亚洲| 日韩一区二区三区在线播放| 欧美日韩视频免费播放| 在线观看国产精品日韩av| 7777精品久久久久久| 久久国产精品久久久久久久久久| 成人综合国产精品| 91久久精品在线| 国产精品九九久久久久久久| 欧美男插女视频| 国产精品一区二区3区| 国产精品香蕉av| 亚洲午夜精品久久久久久性色| 精品久久国产精品| 久久久精品美女| 日韩福利视频在线观看| 久久99热精品这里久久精品| 麻豆成人在线看| 国产午夜精品久久久| 亚洲韩国日本中文字幕| 欧美成人免费视频| 国产精品亚洲片夜色在线| 日韩精品极品在线观看播放免费视频| 国产亚洲人成a一在线v站| 91美女片黄在线观| 国产精品久久久精品| 2019av中文字幕| 日韩国产欧美精品一区二区三区| 亚洲视频在线播放| 亚洲bt天天射| 日韩专区在线播放| 日韩不卡中文字幕| 国产一区香蕉久久| 久久精品国产一区二区三区| 国产亚洲激情在线| 日韩中文字幕在线观看| 欧美日韩国产精品| 亚洲欧美日韩在线一区| 日本免费久久高清视频| 精品久久久久久久久久久久久久| 欧美亚洲伦理www| 日韩久久精品电影| 欧美成人精品不卡视频在线观看| 久久成人亚洲精品| 日韩中文第一页| 久久天天躁狠狠躁夜夜躁2014| 欧美精品videos性欧美| 国产精品美女www爽爽爽视频| 最新69国产成人精品视频免费| 久久精品2019中文字幕|