多公尺諾覆蓋問題的回溯解法

2021-08-31 05:49:12 字數 2070 閱讀 6175

題目:現有6*6大小的棋盤和18張多公尺諾骨牌,每張牌能覆蓋2個棋格,求將多公尺諾骨牌完全覆蓋棋盤的所有組合?

#include #include #include #include #include #include using namespace std;

const int max_length = 2 * 3;

setresult;

//***************==

// 棋盤位置類

//***************==

class position

position(const position& position) : x(position.getx()), y(position.gety())

position(int x, int y) : x(x), y(y)

if (y < 0 || y >= max_length)

}int getx() const

int gety() const

position getright()

position getbottom()

bool valid() const

bool operator==(const position& right) const

};//***************==

// 棋子類

//***************==

class chessman

chessman(const pair& positions) : positions(positions)

pairgetpositions() const

bool valid() const

if (positions.first == positions.second)

return true;

}bool isxdirection() const

return positions.first.getx() == positions.second.getx();

}};//***************==

// 棋盤類

//***************==

class chessboard}}

bool hold(const chessman& chessman)

position second = positions.second;

if (!second.valid() || board[second.getx()][second.gety()])

board[first.getx()][first.gety()] = chessmen.size() + 1;

board[second.getx()][second.gety()] = chessmen.size() + 1;

chessmen.push(chessman);

if (isfinished())

return true;

}bool unhold(chessman& pop)

bool ishold(const position& position) const

}return false;

}bool isfinished() const

string getsolutionstring()

rtn.width(4);

rtn<}

}return rtn.str();

} };int main(int argc, char** argv)

chessman chessmanr(make_pair(currgrid, currgrid.getright()));

chessman chessmanb(make_pair(currgrid, currgrid.getbottom()));

if (board.hold(chessmanr) || board.hold(chessmanb))

}while (true)

}if (i == 0 && j == 0)}}

}cout<<"ok, done."

}

小段問我的多公尺諾問題

今天小段在qq上問我乙個問題,應該是用什麼簡單的方法算的,我想不出來,就寫了個程式,在這裡貼出來,看了這篇文章的朋友有口算的方法告訴我,謝謝!giorgia 2006 10 18 14 49 03 100張多公尺諾骨牌 排成一列,依順序編號為123。99,100。第一次拿走所有奇數字置上的骨牌,第二...

多公尺諾骨牌問題,狀態壓縮dp

題目描述 用1 2 的矩形通過組合拼成大矩形,求拼成指定的大矩形有幾種拼法。首先 我們先求用1 2 的矩形拼成 n m的矩形有多少種拼法 當n m為奇數時,一定是不會拼出來的,因為想要拼出來就需要整數倍的小矩形數目。為了加速演算法,要把m,n中小的那個當做列 分兩個步驟 1 先求出相鄰兩行的轉化關係...

題解 與多公尺諾有關的插頭DP

hdu5731 題意 給你乙個nm的棋盤,我們用12或2 1 即橫著放或豎著放 的骨牌去填充這個棋盤。問你有多少種填法,使得這個棋盤 任意相鄰兩行或兩列之間都必須要有乙個骨牌橫跨。也就是使得這個棋盤為穩定的。題解from phile的空間 先求出不考慮分割線的n m棋盤的覆蓋方案數記為f n m 然...