NOIP模擬 A 剪枝 玩積木

2021-08-09 10:08:59 字數 1311 閱讀 7923

樣例輸入:

1

1 2 0

2 1 2

3 3 3 3

4 4 4 4 4

5 5 5 5 5 5

樣例輸出:

資料範圍:

對於50%的資料,保證十步及以內有解;

對於70%的資料,保證沒有太難了的情況;

對於70%的資料,t≤10;

資料有梯度。

題目分析:

這道題很明顯是一道搜尋題,a*剪枝就可以了。加乙個迭代加深也是沒有問題的。下附**的a*剪枝用的是dfs,但實際上bfs時間才是更優的,但是因為bfs相對難寫需要記錄狀態且空間上有可能會爆(不太確定)。

附**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int fx[5]=;

const

int fy[5]=;

const

int bz[7][7]=;

int t,a[7][7],minn,pox,poy;

bool check;

int readint()

for(;ch>='0'&&ch<='9';ch=getchar()) i=(i<<3)+(i<<1)+ch-'0';

return i*f;

}int pd()//估價函式,有ret個位置不同,則至少需要ret-1步

void dfs(int x,int y,int num)

if(num+bs>minn) return;

if(x>minn-num) return;

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

}}int main()

dfs(pox,poy,0);

if(check==true) printf("%d\n",minn);

else

printf("too difficult\n");

}return

0;}

NOIP2016提高組模擬 積木

比賽的時候用了個神奇的小暴力,本來打算拿40分,沒想到暴力出奇蹟,隨機資料下表現優良,居然碾過去了。暴力方法不講,只貼 僅供對拍。正解顯然要用狀態壓縮 看資料範圍 設fs i,0 1 2 s表示當前已選擇的積木集合,i表示在最上方的積木編號,0 1 2表示最上方的積木哪面朝上。轉移方程容易推導。暴力...

小LK玩積木

時間限制 1 sec 記憶體限制 128 mb 2級機械人 1級機械人 0級機械人 ab,其中第1個關節是a,第2個關節是b 3級機械人 2級機械人 1級機械人 aba,其中第1個關節是a,第2個關節是b,第3個關節是a 4級機械人 3級機械人 2級機械人 abaab 其中第1個關節是a,第2個關節...

NOIP2016提高A組模擬9 2 積木

給你一些方塊,給出每個方塊的長寬高,可以以任意一面為底面,用任意的順序選擇任意一些方塊,下面的方塊一定要完全包含上面的方塊 下面方塊的長,寬分別小於上面方塊的長寬 求最高的搭出積木的高度 看到這個資料範圍,就想到狀壓dp,狀態也是很好設的,我們設f s,i,j,k 表示當前方塊的選取狀態為s,當前在...