例題收藏 例題 V Gap

2022-04-30 23:27:10 字數 2356 閱讀 7339

搜尋訓練開始了……poj的資料比zoj強多了!!看來不得不寫正解了

+傳送門+

有乙個四行九列的矩陣——在第1~4行、2~8列上填上數字 11~17,21~27,31~37,41~47(不一定有序)。例子如下:

現在我們將數字11移動在第一行第一列,21移動在第二行第一列,31移動在第三行第一列,41移動在第四行第一列,上面的例子移動後如下:

若乙個數x(不是最右邊的一列)的右邊位置是空位,設x十位為a,個位為b,若b≠7,我們可以把數(10*a+b+1)放在右邊的空格處。

比如上圖的35的右邊是空格,且個位是5(不是7),我們可以把36移動到右邊的空格處:

最後的目標是把矩陣變成下面這樣:

最少需要移動多少次(不包含一開始移動11,21,31,41)?

包含多組資料,第一行是整數t,表示資料組數。

每組資料報含乙個4*7的矩陣,表示一開始的矩陣的第1~4行、2~8列。

輸出最少需要移動多少次,如果不能達到目標,輸出-1。

為了方便最後判斷,先const乙個常量矩陣gal,表示目標矩陣。輸入過後,按照題目要求先模擬把11,21,31,41移動到第一列。

算是乙個矩陣hash的模板吧……也不知道原理是什麼。大概意思就是把矩陣的元素排成一列(第二行接在第一行後面,其他類似),然後將該序列的每乙個元素都拆分成相等的位數。因為這道題的矩陣中的元素最大只有兩位,所以只需要把每乙個元素都拆分成十位和個位就行了。

然後我們得到了乙個長度為cnt的序列a,則 hash=7cnt*a[0]+7cnt-1*a[1]+7cnt-2*a[2]+...+71*a[cnt-1]+70*a[cnt]

最後hash先與上乙個0x7fffffff再模上乙個 mod=1000007。

ll hash(const int a[8]) ;

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

for(int j=0; j<8; j++)

chc[++cnt]=a[i][j]%10,

chc[++cnt]=a[i][j]/10;

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

ret=ret*7+chc[i];

return (ret&0x7fffffff)%mod;

}

所以我們可以把目標狀態的hash值儲存為ovr,則只需要判斷當前狀態的hash值是否是ovr就可以了。

普通的dfs,就像八數碼一樣……實在想加快的話可以用雙向搜尋,因為我們知道終止狀態……qwq

/*lucky_glass*/

#include#include#include#includeusing namespace std;

typedef long long ll;

const int gal[4][8]= ;

const int mod=1000007;

struct queue beg;

bool vis[mod+5];

int ovr;

void clear()

ll hash(const int a[8]) ;

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

for(int j=0; j<8; j++)

chc[++cnt]=a[i][j]%10,

chc[++cnt]=a[i][j]/10;

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

ret=ret*7+chc[i];

return (ret&0x7fffffff)%mod;

}pairsearch(int a[8],int val)

int bfs()

} return -1;

}int main()

beg.a[i][0]=(i+1)*10+1;

} printf("%d\n",bfs());

} return 0;

}

- lucky_glass

(tab:如果我有沒講清楚的地方可以直接在郵箱[email protected] email我,在週末我會盡量解答並完善部落格~

python3經典例題 經典例題 Python

python python開發 python語言 經典例題 python 經典例題 if巢狀 1.使用者輸入賬號 2.使用者輸入密碼 3.判斷使用者的賬號是不是alex 4.如果賬號是alex在繼續判斷密碼是不是alexdsb 5.賬號和密碼都正確提示使用者alex就是乙個dsb 6.如果賬號正確密...

例題 裝箱問題

問題描述 乙個工廠製造的產品形狀都是長方體,它們的高度都是h,長和寬都相等,一共有6個型號,它們的長度和寬度分別是1x1,2x2,3x3,4x4,5x5,6x6。這些產品通常使用乙個6x6xh的長方體包裹包裝,然後郵寄給客戶。因為郵費很貴,所以工廠要想方設法地減少每個訂單運送時的包裹數量。他們需要有...

例題 線段樹

1 注意討論不能建樹的情況 nkoj 1321 數列操作問題 時間限制 10000 ms 空間限制 165536 kb 問題描述 假設有一列數 1 i n 支援如下兩種操作 將ak的值加d。k,d是輸入的數 輸出as as 1 at。s,t都是輸入的數,s t 輸入格式 第一行乙個整數n,第二行為n...