【冀宝er要逆袭】POJ-1321-棋盘问题,赶脚和八皇后问题是一个思路
2015-07-23 11:17
483 查看
Description
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
Sample Input
2 1
4 4
…#
..#.
.#..
Sample Output
2
1
这题只需要深搜,每次从上一个放棋子地方的下一行开始寻找可以放棋子的地方,当发现该点时,记录行数,并更新棋盘,将于此点同行同列的都更新为’.’,如果找不到,则返回,当把所有棋子都放上去的时候,则找到一个接,计数+1,就这样进行搜索,可以保证AC
下面贴出八皇后问题
这个是在网上摘的代码
再贴一份代码
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
Sample Input
2 1
.
.#4 4
…#
..#.
.#..
…
-1 -1Sample Output
2
1
这题只需要深搜,每次从上一个放棋子地方的下一行开始寻找可以放棋子的地方,当发现该点时,记录行数,并更新棋盘,将于此点同行同列的都更新为’.’,如果找不到,则返回,当把所有棋子都放上去的时候,则找到一个接,计数+1,就这样进行搜索,可以保证AC
#include <iostream> using namespace std; int n,k,ans; char map[9][9]; int vis[9]; //用来记录状态 void dfs(int c,int line) { if(line>=n) //此时证明全部行都搜完了 { if(c==k) ans++; //如果每个点在每行都有位置,则为一种方法 return; } for(int i=0;i<n;i++) if(!vis[i]&&map[line][i]=='#') { vis[i]=1; //标记状态 dfs(c+1,line+1); //搜索下一行,下一个点 vis[i]=0; //重新初始化 } dfs(c,line+1); } int main(int argc, char *argv[]) { while(cin>>n>>k) { if(n==-1&&k==-1) break; for(int i=0;i<n;i++) cin>>map[i]; ans=0; dfs(0,0); cout<<ans<<endl; } return 0; }
下面贴出八皇后问题
这个是在网上摘的代码
#include <iostream> using namespace std; #define N 8 bool matrix[N + 1][N + 1] = {0}; bool IsLegal(bool matrix[N + 1][N + 1], const int &i, const int &j) { // 判断前面的i-1个棋子与matrix[i][j]是否冲突,i为1时合法 for (int m = 1; m <= i - 1; ++m) { for (int n = 1; n <= N; ++n) { // 实际每一行只有一个棋子 if (matrix[m] == 1) { if ( n == j || abs(i - m) == abs(j - n) ) // key, not bad return false; } } } return true; } void Print(bool matrix[N + 1][N + 1]) { static int count = 1; printf("Case %d:\n", count++); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { matrix[i][j] == 1 ? printf("%c ", 2) : printf(". "); } cout << endl; } cout << endl; } void Trial(const int i) { // 进入本函数时,在N*N的棋盘前i-1行已放置了互不攻击的i-1个棋子 // 现从第i行起继续为后续棋子选择合适位置 if (i > N) // 输出当前的合法布局 Print(matrix); else for (int j = 1; j <= N; ++j) { matrix[i][j] = 1; if ( IsLegal(matrix, i, j) ) Trial(i + 1); matrix[i][j] = 0; } } int main(void) { Trial(1); return 0; } #include <iostream> using namespace std; #define N 8 bool matrix[N + 1][N + 1] = {0}; bool IsLegal(bool matrix[N + 1][N + 1], const int &i, const int &j) { // 判断前面的i-1个棋子与matrix[i][j]是否冲突,i为1时合法 for (int m = 1; m <= i - 1; ++m) { for (int n = 1; n <= N; ++n) { // 实际每一行只有一个棋子 if (matrix[m] == 1) { if ( n == j || abs(i - m) == abs(j - n) ) // key, not bad return false; } } } return true; } void Print(bool matrix[N + 1][N + 1]) { static int count = 1; printf("Case %d:\n", count++); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { matrix[i][j] == 1 ? printf("%c ", 2) : printf(". "); } cout << endl; } cout << endl; } void Trial(const int i) { // 进入本函数时,在N*N的棋盘前i-1行已放置了互不攻击的i-1个棋子 // 现从第i行起继续为后续棋子选择合适位置 if (i > N) // 输出当前的合法布局 Print(matrix); else for (int j = 1; j <= N; ++j) { matrix[i][j] = 1; if ( IsLegal(matrix, i, j) ) Trial(i + 1); matrix[i][j] = 0; } } int main(void) { Trial(1); return 0; }
再贴一份代码
#include<stdio.h> #include<math.h> int x[100]; bool place(int k)//考察皇后k放置在x[k]列是否发生冲突 { int i; for(i=1;i<k;i++) if(x[k]==x[i]||abs(k-i)==abs(x[k]-x[i])) return false; return true; } void queue(int n) { int i,k; for(i=1;i<=n;i++) x[i]=0; k=1; while(k>=1) { x[k]=x[k]+1; //在下一列放置第k个皇后 while(x[k]<=n&&!place(k)) x[k]=x[k]+1;//搜索下一列 if(x[k]<=n&&k==n)//得到一个输出 { for(i=1;i<=n;i++) printf("%d ",x[i]); printf("\n"); //return;//若return则只求出其中一种解,若不return则可以继续回溯,求出全部的可能的解 } else if(x[k]<=n&&k<n) k=k+1;//放置下一个皇后 else { x[k]=0;//重置x[k],回溯 k=k-1; } } } void main() { int n; printf("输入皇后个数n:\n"); scanf("%d",&n); queue(n); }
相关文章推荐
- 对binary-search-tree的tree-delete算法的更正
- ASP.NET请求处理过程
- 第6章 服务模式 Service Interface(服务接口)
- 我活着
- 231Power of Two
- ExcelUtils遍历集合时获取当前的索引
- iOS模拟器状态栏改变字体颜色
- 使用图灵api创建微信聊天机器人
- 函数参数的传递问题(一级指针和二级指针)
- Spring框架下的管理员登录功能实现
- Android Sqlite 批量 insert/update 提高效率
- 通过网页的JS代码启动移动APP
- IntelliJ IDEA的光芒会盖过Eclipse吗
- 常用颜色代码表以及中国传统颜色名录
- android中Toast的用法
- windows重启mysql命令
- java基础知识杂谈
- HOJ 2662 Pieces Assignment(状态压缩DP)
- logrotate <备忘>
- ERROR 1129 (00000) Host * is blocked because of many connection errors; unblock with ‘mysqlad解决