魔法數字 problem Bfs搜尋

2021-08-01 19:38:09 字數 2273 閱讀 4621

魔法數字

(a.pas/.c/.cpp)

時間限制:1.0s,空間限制131072 kb

題目描述:

給乙個六位數a 和另外乙個六位數b.

你有一根魔法棒,初始時指向a 的最左邊數字,每一次你可以選擇下列操作

之一:

1.將當前魔杖指向的數字與最左端的乙個數字調換位置。

2.將當前魔杖指向的數字與最右端的乙個數字調換位置。

3.將當前魔杖指向的數字+1。(若當前魔杖指向的數字為9 則無效)

4.將當前魔杖指向的數字−1。(若當前魔杖指向的數字為0 則無效)

5.將當前魔杖向右移動一位。

6.將當前魔杖向左移動一位。

輸入描述:

多組資料,處理到eof

對於每組資料,包含兩個6 位數a,b

輸出描述:

對於每組資料,輸出一行表示答案..

樣例輸入:

1 123456 654321

樣例輸出:

11 資料範圍:

100%的資料保證:1 <= 資料組數 <= 200

雜湊收好

#include 

#include

#define maxn 3000005

#define hashxor 7712122068ll

#define hashor 111827282ll

#define hashmod 1000007

#define hashand 2332333

const unsigned int cnt = ;

inline int

abs ( int a )

#define min(a, b) ((a) < (b) ? (a) : (b))

int a, b, fr, tl, ans, ord, state_cnt, val, nxt[hashmod], head[hashmod], tmp[10], target[10];

struct state

state ( int

s, int v ) : s ( s ), v ( v )

} q[maxn], cur;

inline int hash_val ( int& x )

inline short insert ( int

pos )

nxt[pos] = head[val];

head[val] = pos;

return1;}

int bfs ( int& init ) else --tl;

tmp[pos] ^ tmp[0] ? tmp[pos] ^= tmp[0] ^= tmp[pos] ^= tmp[0] : 0;

}flag = ( pos == 5 || (!pos && !tmp[5]) ) ? 0 : 1;

if ( flag ) else --tl;

tmp[pos] ^ tmp[5] ? tmp[pos] ^= tmp[5] ^= tmp[pos] ^= tmp[5] : 0;

}if ( pos

< 5 ) else --tl;

}if ( pos ) else --tl;}}

return tl;

}int main ( )

memset ( head, 0, sizeof head );

ord = 5;

while ( ~ord ) target[ord --] = b % 10, b /= 10;

state_cnt = bfs ( a );

ans = 0x3f3f3f3f;

i = 1;

loop:;

q[i].v /= 10;

ord = 5;

while ( ~ord ) tmp[ord --] = q[i].v % 10, q[i].v /= 10;

static int step;

step = q[i].s;

for ( j = 0 ; j < 6; ++j )

if (target[j] ^ tmp[j] && !q[i].go[j]) else step += abs(target[j] - tmp[j]);

ans > step ? ans = step : 0;

if ( ++i <= state_cnt ) goto loop;

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

}}

關於魔法數值 魔法數字 魔法值

其實這幾個詞代表的是乙個意思,只是不同的叫法,所謂魔法數值是指在 中直接出現的數值,只有在這個數值記述的那部分 中才能明確了解其含義。而在程式設計領域指的是莫名其妙出現的數字,數字的意義必須通過詳細閱讀才能推斷出來。一般魔法數字都是需要使用列舉變數來替換的 魔法數值使 的可讀性大大下降。而且,如果同...

NOIP模擬 魔法數字

在數論領域中,人們研究的基礎莫過於數字的整除關係。一般情況下,我們說整除總在兩個數字間進行,例如 a b a能整除b 表示 b 除以 a 的餘數為 0 我們稱乙個數字 x 是魔法的,當且僅當 x 是整數,且它能被 k 及 k 以上種一位數整除,要求這若干種一位數均在 x 的十進位制表示中出現。給出整...

記錄 C 程式設計魔法數字6174

乙個四位數的魔法數字。描述 第一步 乙個四位數拆分每一位,成四個數字 第二步 用第一步拆分的四個數子組成乙個最大四位數和乙個最小四位數 第三步 用第二步中的最大數減去最小數,之差等於6174則第一步原始四位數是魔法數字 否則將差進行第一步操作,依次迴圈,當迴圈15次之後不再迴圈。created by...