POJ 1321 棋盘问题(回溯)
生活随笔
收集整理的這篇文章主要介紹了
POJ 1321 棋盘问题(回溯)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 1.1 題目鏈接
- 1.2 題目大意
- 1.3 解題思路
- 2. 代碼
- 2.1 Accepted 代碼
1. 題目
1.1 題目鏈接
http://poj.org/problem?id=1321
1.2 題目大意
在一個給定形狀的棋盤(只能在#號的位置擺放)上面擺放棋子,棋子沒有區(qū)別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,求解對于給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案個數(shù)。
1.3 解題思路
采用回溯算法,暴力枚舉
2. 代碼
2.1 Accepted 代碼
/*** @description: poj1321回溯* @author: michael ming* @date: 2019/7/13 13:58* @modified by: */ #include <iostream> #include <string> using namespace std;bool a[10][10];//存儲棋盤 int result[10];//存儲是否存放棋子(和8皇后類似) bool isok(int r, int c)//判斷是否可以擺放 {for(int i = r - 1; i >= 0; --i)//逐行向上考察每一行{if(result[i] == c)//上面所有行的c列有棋子嗎return false;}return true; }void flip(int r, int num, int &count, int n, int k) {if(num == k) //k個棋子都放置好了{count++; //記錄可行方案數(shù)return;//都放置好了,沒法再遞歸了}if(r == n)return;//邊界,沒法再遞歸了for(int column = 0; column < n; ++column)//r行可能有n種放法{if(a[r][column] != 1)continue;//尋找可放置的位置if(isok(r,column)) //該放法滿足要求{result[r] = column;//第r行的棋子放到了column列num++;//放置棋子數(shù)加1flip(r+1, num, count, n, k); //放了棋子 考察下一行result[r] = -1;//恢復現(xiàn)場,這個地方不放棋子,找下一種方法num--;//放置的棋子數(shù)減1}}flip(r+1, num, count, n, k); //第r行不放棋子,考察下一行 } int main() {string s;int i, j, n, k, num = 0, count;while(cin >> n >> k && n != -1){count = 0;//計數(shù)清零for (i = 0; i < n; ++i)//輸入地圖{cin >> s;for (j = 0; j < n; ++j){if (s[j] == '#')a[i][j] = 1;//1的地方才可以放棋子elsea[i][j] = 0;}}flip(0, num, count, n, k);cout << count << endl;}return 0; }總結
以上是生活随笔為你收集整理的POJ 1321 棋盘问题(回溯)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构--栈--共享顺序栈
- 下一篇: LeetCode 1038. 从二叉搜索