海亮DAY11 題解 反思 搜尋專練

2021-08-21 11:22:54 字數 4664 閱讀 9351

**:海亮集訓-題解

#一、馬的遍歷

題意簡述:有乙個nm的棋盤(1m的矩陣,代表馬到達某個點最少要走幾步(不能到達則輸出-1

每行的m個數用空格隔開

分析:。。這題目太不良心了。。連馬走的座標都不告訴我們。。害的我花了一分鐘來模擬馬的走向。。(假的)。那麼這題就是一道裸的bfs啊!因為bfs總是擅長於求一些最優值問題,這主要得益於bfs的乙個性質:在一般情況下,bfs所第一次遍歷到的某個狀態,一般都是最優的。(注:是一般情況,具體原因接下來會有一道例題說明)。

那麼這就是一道bfs模板題,沒什麼可以講(bfs具體請見《回憶bfs》)

那麼具體**如下:

#include

using

namespace std;

struct nodeq[

2000001]=

;int a[

501]

[501]=

;int n,m,x,y;

bool f[

501]

[501]=

;int dx[8]

=;int dy[8]

=;//馬居然是走日字的。。

inline

boolff(

int aa,

int bb)

intmain()

for(

int i=

1;i<=n;i++

)// fclose(stdin);

// fclose(stdout);

return0;

}

題意簡述:這次小可可想解決的難題和中國象棋有關,在乙個n行m列的棋盤上,讓你放若干個炮(可以是0個),使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是:乙個炮攻擊到另乙個炮,當且僅當它們在同一行或同一列中,且它們之間恰好 有乙個棋子。你也來和小可可一起鍛鍊一下思維吧!

【輸入】

一行包含兩個整數n,m,之間由乙個空格隔開。(n<=m<=6)

【輸出】

總共的方案數

答案不超過int能容納的最大值

分析:這道題是某省省選的一道題的%30的資料。(原來要用狀壓dp)

那麼我們考慮如何搜尋:

對於每種狀態,都有三種情況:取兩個炮,取乙個炮和不取炮

我們可以在外層搞乙個迴圈來列舉放的炮的個數

對於每種狀態,搜尋這三種情況即可

(不過居然有些大佬用美麗的打表水了過去)
那麼具體**如下:

#include

using

namespace std;

int lp[

100001]=

;int n,m,ans=0;

void

dfs(

int k,

int t,

int x)

//說明已經放好

if(t-

1==n)

return

;//已經超出行數,不能再放

for(

int i=

1;i<=m;i++)if

(lp[i]

<2)

dfs(k+

1,t+

1,x)

;//放乙個棋子

lp[i]--;

//回溯

}dfs

(k,t+

1,x)

;//不放

}int

main()

if((n==

6&& m==5)

||(n==

5&& m==6)

)if((n==

6&& m==4)

||(n==

4&& m==6)

)if(n==

5&& m==5)

//打表請直接無視

for(

int i=

0;i<=n*m;i++

)memset

(lp,0,

sizeof

(lp)),

dfs(1,

1,i)

; cout

}

題意簡述:

有乙個奇怪的機械人,它被關在乙個實驗室裡。

實驗室是乙個長方形,被分成了n行m列個格仔,某些格仔能走而有些不嫩

現在這個機械人每次能走到與他相鄰的上下左右四個格仔(如果相鄰的格仔能走的話),但是不同方向的花費不一樣,往上,下,左,右四個方向走一次分別需要花費1,2,3,4塊錢。

機械人在第x1行y1列的格仔上,出口在x2行y2列的格仔上,問你機械人想出去最少需要花多少錢?

【輸入】

第一行兩個用空格隔開的整數n和m

接下來n行,每行m個字元,表示地圖

如果第i行j列個字元為』.』,表示這個地方能走,否則不能

最後一行四個用空格隔開的整數x1,y1,x2,y2

保證第x1行y1列和第x2行y2列一定是』.』

【輸出】

一行乙個整數,如果機械人能出去則為它最少需要花多少錢,否則為-1

分析:這便是我所說的違背bfs的特性的題目。因為這時每一種狀態所付出的代價是不一定的,有可能它花了一點點的時間走到終點所需要的錢還是繞遠路所需要的錢多。

不過也無妨,只需要加乙個判斷便可,其他的基本不變。也是一道非常水的題(萬惡的方位陣列啊!!)

那麼具體**如下:

#include

using

namespace std;

int n,m;

int x,y,zd,zdd;

bool f[

101]

[101]=

;int a[

101]

[101];

int dx[4]

=;int dy[4]

=;//萬惡的方位陣列啊啊啊!

int money[4]

=;struct nodeq[

100001]=

;bool vis[

101]

[101]=

;int

main()

scanf

("%d%d%d%d"

,&x,

&y,&zd,

&zdd)

;int head,tail=0;

memset

(a,50

,sizeof

(a))

; q[

++tail]

.l=x;

q[tail]

.r=y;

//入隊

a[x]

[y]=0;

vis[x]

[y]=1;

//初始化

for(head=

1;head<=tail;head++

)printf

("%d"

,vis[zd]

[zdd]

?a[zd]

[zdd]:-

1);//輸出

fclose

(stdin);

fclose

(stdout);

return0;

}

題意簡述:給一 n×n 字母方陣,內可能蘊含多個「yizhong」單詞。單詞在方陣中是沿著同一方向連續擺放的。擺放可沿著 8 個方向的任一方向,同一單詞擺放時不再改變方向,單詞與單詞之間可以交叉,因此有可能共用字母。輸出時,將不是單詞的字母用*代替,以突出顯示單詞。

分析:這道題其實並不是一道搜尋,而是一道列舉。

搜尋整個方陣,尋找y,如果找到乙個y就搜尋八個方向,看是否與原單詞相等,如果相等,就可以覆蓋(定乙個字元陣列為答案,初始化為』*』)

這道題思路非常簡單,但也是比較考驗**實驗能力的(除了某些大佬用打表水過去的以外)

那麼具體**如下:

#include

using

namespace std;

int dx[8]

=;int dy[8]

=;int n;

char chh[8]

=;char ch1[

201]

[201];

char ch[

201]

[201];

inline

boolf(

int x,

int y,

int z)

return i>6;

//萬惡的等號啊啊啊啊!!!(當時寫了個等號,只拿了60。。不夠嚴謹啊)

}//如果每個單詞都對應,i必定》6,就可行

intmain()

//進行覆蓋

}for

(int i=

1;i<=n;i++

)fclose

(stdin);

fclose

(stdout);

return0;

}

#大總結

1、題目給我看清楚了

2、變數名給我用清楚了

#3、檔名給我寫清楚了

4、方位陣列給我定清楚了

5、給我嚴謹起來啊啊啊啊啊

NOI題解DAY1 1 回家路線

於我而言,今年的noi簡直殺人。即使我只考了第一天,我就崩潰了。還是我太菜,我自己而言,我最多得五分不能再多了。後來交了 確實只有五分。反正大家知道我菜就對了。有 n 個點和 m 趟列車,第 i 輛列車於 pi 時刻從 xi 號點出發,於 qi 時刻到達 yi 號點。有乙隻小貓要從 1 號點坐車到 ...

手機衛士day11

系統程序顯示和隱藏 建立程序管理設定頁面 processmanagersettingactivity 編寫設定頁面布局檔案 監聽checkbox的勾選事件,更新本地sharepreference 根據本地記錄,更新checkbox狀態 boolean showsystem mprefs.getboo...

實習日記 Day11

滴 今日份心得總結卡 今日最大心得其實應該是,穿一條薄褲子還露腳踝的我怕是失了智,早上腿差點都凍僵了 1.不要從別人身上尋求安心 做好自己,降低對人際關係的預期。果然,邊際遞減效應 應驗了,上週還覺得和諧無比的同事 師徒關係,這週就開始覺察到距離感。我曾以為我的認真工作和順利完成任務能得到上司或者師...