Time of Update: 2018-12-05
題意比較好理解分析一下,從一個數字可以有三種操作,加1,減1,和相鄰的換位置,每一個操作,對應一個步驟,問給定一個原始值和目的值,從原始到目的,的最少變換步驟是多少?注意,這裡的所有數字只能從1到9分析:對於每個數,有四位元字,每個數字三種操作,具體說中間的兩數字有四種操作,分別和左右換位置,所以從一個數可以走14種狀態,也就是14個路到下一個數,注意這裡很可能走到重複的數,所以要用一個vis判重,一個數字遍曆一遍即可,而且只有這樣,才能保證得到是最小值。那麼下面的是代碼,對於每個數,枚舉它能到
Time of Update: 2018-12-05
題目:有一些格子,這些格子都是挨著的,並排擺放的,有的格子裡面有石子,有的沒有,當滿足一下條件的時候,就會做一下的操作: 條件:用1表示有格子,0表示沒有。如果連續的三個格子的狀態是011,就把它給成100,
Time of Update: 2018-12-05
可以說這道題目,涉及了很多知識點,是一道很好的題目。首先這道題涉及了計算幾何的知識,求圓心座標的橫距離進而求出圓心座標;其次,這道題目資料不大,很容易想到dfs;最後這道題涉及到了全排列!理論上這道題還可以剪枝,步驟也不是很麻煩,但是不剪枝也是可以過的!下面說一下我最開始的想法,這個想法很麻煩,最後wa了,簡單說一下,就是從右向左判斷,一次和圓相切,算出座標,然後假定這個座標,然後繼續向左判斷看看有沒有和它相交的圓。話說這個想法很麻煩,然後自後求長度的時候,也求錯了,其實找到最左邊的座標和最右邊
Time of Update: 2018-12-05
必要要先說一下:位元運算,真TM強大呀!!!!8皇后的問題,衍生出來的N皇后的問題,我開始真的是按行暴搜,唯一最佳化的是用二進位來判斷對角線和列上是否有皇后。必然逾時。研究了一下大牛的代碼,位元運算被神一樣的運用!ORZ!剪枝:1、一個數和它的負數取與,得到的是最右邊的1!負數在電腦裡面的表示是原碼取反加1,可以試一下,確實是得到最右邊的。這樣就可以簡化for迴圈,免得一位一位地判斷了;2、按照行來進行枚舉,同時將兩個對角線和列的狀況壓縮表示!詳細解釋的話,我們可以這樣想,對於任何一行,都有n個
Time of Update: 2018-12-05
題目:一個圖,源點有三個,每個點被遍曆的條件是這個點和三個已經遍曆過的點相連!初始的時候,有三個點是已經遍曆過的,問每個點被遍曆的時間!分析:我選擇廣度優先搜尋。對每一個和遍曆過的點相連的進行判斷,判斷是否和三個以上的遍曆過的點相連,如果是,那麼把它排入佇列,同時它wake時間是所有與它相連的並且已經遍曆過的點的第三小的時間加1(這個要自己好好考慮,仔細讀題)。然後把這個點設為已遍曆!代碼:#include <cstdio>#include
Time of Update: 2018-12-05
題目連結有n首歌,編號從1到n,每首歌播放時間為t,播放次數為c,n首歌按次序播放,有m個詢問,輸出第v分鐘現正播放的歌曲編號。很簡單的二分尋找,直接貼代碼。//2013-05-23-20.26#include <stdio.h>#include <string.h>using namespace std;const int maxn = 100005;int sum[maxn];int binary_search(int l, int r, int v){
Time of Update: 2018-12-05
隱式圖搜尋是最難受的題目之一,但是一般情況下,如果是隱式圖搜尋的話,都要選項組,都會有一個狀態的轉移。比如這道題,其實狀態是只有第三個杯子裡面有裝滿水,第一和第二個杯子裡面都是空,那麼這個狀態可以轉移的話,只能有兩個方向的轉移。第一是想第一杯子倒水,第二是向第二個杯子倒水,那無論是那種轉移,只要這個狀態曾經存在過,那麼這個狀態能轉移到的狀態就已經遍曆過,並且每個狀態都要有一個唯一的標識,可以通過這個標識來確認這個狀態是否已經存在過!如果存在過,就不要再對這個狀態進行轉移了。所以對於隱式圖的搜尋,
Time of Update: 2018-12-05
//純八皇后問題,沒什麼好說的#include <stdio.h>#include <string.h>#include <stdlib.h>int map[10][10];int sum, max, C[20000];void dfs( int cur ){int i, j, ok;if( cur == 8 ){sum = 0;for( i = 0; i < 8; i++ )sum += map[i][C[i]];if( sum > max
Time of Update: 2018-12-05
題目:給出一些可以走的點,這些點是一段一段的形式給出的,比如第5行的第1個格子到第4個格子是可以走的點。第二比較特別的是資料特別大,10^9的規模!果斷是數組以及鏈表很難解決的東西呀!尤其是標記這部分!所以,map是必備的。用map不僅去標記是否允許走,還可以表示是否走過,並且儲存可行點到起點的最短距離。代碼:#include <cstdio>#include <map>#include <cstring>#include
Time of Update: 2018-12-05
//劉汝佳的白皮書推薦習題暴力專題,這題倒是很水,但是剛開始弄了半天才理解題意,可能是資料給的有點混淆吧//資料如下/*31 2 3 14 5 6 27 8 9 341 2 3 11 4 5 21 6 7 31 8 9 40N個3人組合中,只要任選3個組成一個不重複的組合,即為全部組合,而N為4的那個資料所有3人組裡面都有1,所以是無法組成9人組的。所以就是-1*/#include <stdio.h>#include <string.h>int
Time of Update: 2018-12-05
這是一道比較基礎的BFS的題目。和其他題目不同的是,這道題需要初始化一下每個格子起火的時間。這幾天參加比賽,發現,演算法死套模板真的不對,要靈活運用,發揮自己智慧的大腦,才能有更優秀的演算法的應用!還有,分析問題的能力也真的很重要,一道題目可能說得很長,但是最有用的只有那麼幾句話,從那幾句話中再提煉出來一些實質性的東西,就是解題的思路了!想這道題,實際上就是兩次求最短路徑,第一次求最短路徑,限制第二次求最短路徑!還有一個思想就是超級源,這是一個比較比片的思想在解題的過程中,網路會用得比較多。這裡
Time of Update: 2018-12-05
題目:矩陣中一共是四種點,起點,終點,路,牆。一個輪子,只能往前走,這個輪子的輪胎被分為5個部分,每個部分是一個顏色,求的是從原點走到終點,並且在終點的時候輪子著地的顏色和在起點的時候的顏色是一致的,最少多少步。對於搜尋,有的是對圖搜尋(樹劃歸為圖),有的是隱式圖搜尋。圖的搜尋還是比較好辦,主要是對於隱式圖的搜尋,是比較有難度的。最近做過的題目中,對於隱式圖的搜尋大多都是基於狀態作為節點的,一般還有用狀態壓縮來選項組(即二進位),那麼位元運算就是比較常用的。那麼結合這道題來說一下狀態。狀態我認為
Time of Update: 2018-12-05
#include <stdio.h>int N;int cal, max;char map[10][10];void dfs( int cal ){int i, j;if( cal > max )max = cal;for( i = 1; i <= N; i++ )for( j = 1; j <= N; j++ )if( map[i][j] == '.' && canput(i,j) ){map[i][j] = 'b';dfs( cal+1 );
Time of Update: 2018-12-05
(define x (list (list 1 2) (list 3 4)))上面的list 原來其實就是一個二叉樹,但是初次學習,看了40分鐘竟然也沒有意識到。最後還是看了看題解,二叉樹的遍曆而已。 lisp的一個表幾乎就可以表示許多資料結構,鏈表,二叉樹,甚至圖。 這和其他語言真的很不一樣。下面是代碼:#lang planet neil/sicp(define x (list (list 1 2) (list 3 4)))(define (deep-reverse tree)
Time of Update: 2018-12-05
//這題用的是最笨的方法,建樹然後合并,然後計算//最開始建樹都有點問題,最開始用的是指標指向字串,通過指標一個一個建樹,可是怎麼都過不了,於是就參考網上直接傳數組,求大神解釋一下啊//還有一個問題就是 最後資料都過了總是runtime error,果然一般runtime error都是數組開小了,,,把數組從1000開到5000 終於AC!!!!!!!!#include <stdio.h>#include <malloc.h>#include
Time of Update: 2018-12-05
《演算法競賽入門經典》上的八皇后問題,回溯。還是遞迴的運用。#include<cstdio>#include<cstring>using namespace std;int maze[8][8],c[100],max,n=8;void search(int cur){ int i,j; if(cur==n) { int sum=0; for(i=0; i<n; i++)
Time of Update: 2018-12-05
最近在學習unix編程,看了看別人寫的小遊戲代碼,於是學習了signal()函數。signal(SIGWINCH, (void (*)(int)) handle_signal);上面這一行是小遊戲的原始碼第一個參數是指訊號類型,一般都是int類型的宏定義常量SIGWINCH 表示的是當Terminal的視窗大小改變的時候,發送給Foreground Group的所有進程。還有許多這樣的宏定義,都是以SIG開頭,如SIGABORT, SIGALRM, SIGFPE等等....這裡我就不一一例舉了,
Time of Update: 2018-12-05
這道題有一個很重要的資訊就是,走過的格子不能再走了,所以我覺得回溯+剪枝即可。剪枝是很必要的,因為每個格子有4個選擇,那最差的情況下應該是4^49次冪吧......剪枝有幾點:第一,就是計算一下最短路徑,看在限制的的步數之內是否能走到第二,就是超過k步的就返回第三,如果已經找到了出口,就是退回第四,很重要的是,在一個矩陣中,從一個點到另一個點,可能走的步數的奇偶性是一樣的,如果從當前點到出口的步數的奇偶性與剩下的步數的奇偶性不同的話,那麼那麼就是肯定走不到的,需要剪枝的代碼如下:#include
Time of Update: 2018-12-05
這道題比較難辦的是輸入,有空格,要用gets();然後就是本小妞有馬虎了,多寫了一個else,結果半天沒有音訊!還有就是,使得這個點不超範圍,範圍是要用&&來判斷的,今天耍小聰明||了一下果斷錯了!然後‘-’和‘_',減號和底線今天還打混了!!!這些都要注意了代碼:#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using
Time of Update: 2018-12-05
這段時間一直在忙實驗室的事情,好長時間沒有寫題了,HDOJ 11頁有一些水題,這幾天又刷了刷,不過感覺HDOJ 2037這道題還是不錯的.總的思想是貪心演算法.開始我的思想比網上的要麻煩一些,我是把所有數都按照第一位排序,然後找重疊的區間,後來發現網上的題解有更簡單的方法,就是把所有數按第二位排序然後比較前一個數的末尾和後一個數的首位,貪心演算法果然博大精深.....#include <stdio.h>#include <iostream>#define MAX 1000