題目描述:n為正方形棋盤一維長度,k為需放置的棋子數,在放置棋子時,任意兩個棋子必須不同行不同列。給出n,k以及棋盤形狀,求放置k個棋子的方案數。
思路:有點像八皇后問題,需要dfs解決。dfs的重點是如何簡化搜尋,防止重複計數。一開始沒有考慮複雜度,重複搜尋方案,最後結果除以對應組合數,會超時而且可能爆int。
為了保證一種情況只被搜到一次,我們需要確定搜尋的合適的序,達到在多維空間裡窮盡所有情況不重不漏。
1.所有棋盤上合法的點都依次作為第乙個下棋的點
2.每次搜尋時保證有序,只會搜尋當前棋子行的後面的行。
這樣可以保證列舉所有的情況,並且所有的情況都不相同。
ac**
//#include#include#include#includeusing namespace std;
typedef long long ll;
typedef long double db;
typedef pairpii;
#define de(x) cout << #x << "=" << x << endl
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define lb(x) (x&-(x))
const int n = 101010;
int n,k;
int cnt;
char grid[10][10];
int visr[10];
int visc[10];
int chk(int ii,int jj)
//思路 通過搜尋確定
void dfs(int x,int y,int depth)
rep(i,x,n+1) rep(j,1,n+1) }
}int main()
}printf("%d\n",cnt);
} return 0;
}
POJ 1321 棋盤問題
time limit 1000ms memory limit 10000k total submissions 7007 accepted 3390 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列...
poj 1321 棋盤問題
棋盤問題 time limit 1000ms memory limit 10000k total submissions 15365 accepted 7600 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一...
POJ 1321 棋盤問題
找到第乙個有 的行開始回溯就可以了 include include using namespace std const int maxn 9 char board maxn maxn bool c maxn int ans,n,k void backtracking int curi,int cnt...