2020 11 24 考試題解

2022-05-25 12:42:14 字數 2093 閱讀 4586

尋找最少步數,一看就知道是用廣搜。 (雖然我考場上用的時深搜+迭代加深)

每次只能與上下左右的交換,如果直接暴力列舉,肯定超時,考慮優化。

<1>如果有乙個點和我們要交換的點顏色一樣,就沒必要換了。

<2>我們可以用狀壓,將每次的判斷從\(o(16)\)變為\(o(1)\)。

有這些就可以了,要想更進一步,可以用雙向搜尋(不會,之後有空再補)。

加強版的**

#includeusing namespace std;

#define il inline

#define vocaloid(v) (v>='0'&&v<='9')

template il void read(t &x)

}int dx[4]=,dy[4]=;

int a[5][5],b[5][5],vis[(1<<16)-1],fa[(1<<16)-1];

int res[100039][4];

int beg,end,ia;

struct ansans[100039];

queueq;

il void init()//讀入

for(int i=1;i<=4;i++)

for(int j=1;j<=4;j++) }

il int getdeci(int x[5][5])//轉成壓縮的狀態

return comb;

}il void change(int x,int a[5][5])//根據狀態轉回棋盤 }}

il bool check(int x,int y,int xx,int yy)

il void bfs()

; fa[deci]=now_deci;

q.push(deci);

}if(deci==end) return ;

}if(flag)

swap(a[x][y],a[xx][yy]);

}} }}

int main()

printf("%d\n",ia);

for(int i=ia;i>=1;i--)

printf("%d%d%d%d\n",res[i][0],res[i][1],res[i][2],res[i][3]);

return 0;

}

對於這道題,我們可以打出乙個非常暴力的暴力,時間複雜度大概為\(o(m^m)\),**如下:

il void dfs(int pos,int sum)

for(int i=1;i<=m;i++) }

}

肯定超時,所以我們需要優化。

我們注意到題目中說只有\(1,2,3,4\)四種卡牌,且每張不超過\(50\)張。所以我們可以開乙個四位陣列\(f_\),表示使用了\(1\)卡牌\(i\)張,\(2\)卡牌\(j\)張,\(3\)卡牌\(p\)張,\(4\)卡牌\(q\)張時獲得的最大分數。

我們不必關心這契卡牌是以怎樣的順序使用的,反正最後都會走到同乙個位置,所以我們可以用記憶化搜尋或動規,轉移方程為:

\[f_=\max,f_,f_,f_)}+a_

\]\[now=1+1\times i+2\times j+3\times p+4\times q

\]接下來就可以直接\(dp\)了,時間複雜度最大為\(o(50^4)\)。

**如下:

#includeusing namespace std;

#define il inline

#define vocaloid(v) (v>='0'&&v<='9')

template il void read(t &x)

}int n,m,f[59][59][59][59];

int a[399],g[7];

il int dfs(int i,int j,int p,int q)//記憶化搜尋

printf("%d\n",f[g[1]][g[2]][g[3]][g[4]]);*/

printf("%d\n",dfs(0,0,0,0)+a[1]);

return 0;

}

考試題題解

主講人igl albl 試題t2 t3 t1 t4 t5 暴力 dfs所有路徑,在使用clock的情況下預計 text 題意 給你一張有向圖,距離為 text 的正整數次冪的兩點間可以重新連一條長為 text 邊,求在此情況下的從起點到終點最短路。我們用 text 表示點 text 到點 text ...

考試題解集合

某天忽然發現自己的blog裡全是考試題解 那麼為什麼不鏈到一篇blog裡呢?避免首頁全是加密blog看起來不大友善,大概也會整齊一點。估計是個大工程但還是作死地開始啦。有些難題是單獨寫的,就不鏈了。密碼仍然是開機使用者名稱 入學年份 兩個班級,希望總是能比過去的自己更用心!2018 4月 14 17...

2020 11 25 考試題解

題目描述 有一圈數,其數目為n個,定義一次操作為每個數變為原數圈中的自己與相鄰的兩個數這三個數的異或和,給出原陣列和操作次數,請算出最後的結果陣列。輸入資料 輸入第一行包含兩個正整數n和k,分別表示陣列數目和操作次數。第二行 n 個整數。輸出資料 僅包含一行n個整數。樣例輸入 3 1 1 2 3樣例...