1. 程式人生 > >分治算法經典案例 - 棋盤問題

分治算法經典案例 - 棋盤問題

mat 規模 白色 str c++ amp ems review mes

2017-08-26 20:18:50

writer:pprp

問題大概描述:

有一個2k?2k的方格棋盤,恰有一個方格是黑色的,其他為白色。你的任務是用包含3個方格的L型牌覆蓋所有白色方格。

黑色方格不能被覆蓋,且任意一個白色方格不能同時被兩個或更多牌覆蓋。

用分治法來解決,分治的時候要確定狀態,需要什麽狀態,結束條件

結束條件是size規模變成了1的時候,就要退出了;

需要的狀態,起始點,黑色塊的位置,size邊長

/*
@theme:棋盤用L型的塊堆滿
@writer:pprp
@declare:最經典的分治算法
@date:2017/8/26
*/
#include <bits/stdc++.h>
#include 
<iostream> using namespace std; const int maxn = 10000; int chess[maxn][maxn]; int number; void chessBoard(int row, int column, int x, int y, int Size) { if(Size == 1) return ;//退出條件 int ss = Size/2;//分治,規模減半 int t = ++number; int centerRow = row + ss; int centerColumn = column + ss;
//開始判斷四個方向 //左上角判斷 if(x < centerRow && y < centerColumn) { chessBoard(row,column,x,y,ss); } else { chess[centerRow-1][centerColumn-1] = t; chessBoard(row,column,centerRow-1,centerColumn-1,ss); }
//右上角判斷 if(x < centerRow && y >= centerColumn) { chessBoard(row,centerColumn,x,y,ss); } else { chess[centerRow-1][centerColumn] = t; chessBoard(row,centerColumn,centerRow-1,centerColumn,ss); } //左下角判斷 if(x >= centerRow && y < centerColumn) { chessBoard(centerRow,column,x,y,ss); } else { chess[centerRow][centerColumn-1] = t; chessBoard(centerRow,column,centerRow,centerColumn-1,ss); } //右下角判斷 if(x >= centerRow && y >= centerColumn) { chessBoard(centerRow,centerColumn,x,y,ss); } else { chess[centerRow][centerColumn] = t; chessBoard(centerRow,centerColumn,centerRow,centerColumn,ss); } } int main() { int Size; int x, y; while(cin >> Size && Size) { memset(chess, 0, sizeof(chess)); cin >> x >> y; chessBoard(0,0,x,y,Size); chess[x][y] = number = 1; for(int i = 0 ; i < Size; i++) { for(int j = 0 ; j < Size ; j++) { cout << chess[i][j]<< "\t"; } cout << endl << endl;; } } return 0; }

分治算法經典案例 - 棋盤問題