`

POJ 1321 棋盘问题

    博客分类:
  • ACM
阅读更多
题目在http://acm.pku.edu.cn/JudgeOnline/problem?id=1321
steve同学用java写了这道题老是runtime error,我让他把数组开大点,说结果还是runtime error,于是我写了一下,结果ac了,后来他用c++写也ac了。
这个题就是回溯法,和八皇后类似。
/**
 *Author fuliang
 *poj 1321
 */
#include<iostream>
#include<cstring>
using namespace std;

const int MAX = 9;
char board[MAX][MAX];//记录棋盘状态
bool placed_c[MAX];//记录一列是否已经放过棋子
int count;//放棋子的方案数
int num_p;//已放棋子数目
int n,k;//棋盘n*n,放的棋子数k

/*
 *是否可以放棋子
 */
bool can_place(int i,int j){
	return !placed_c[j] && board[i][j] == '#';
}
/*
 *深搜/回溯
 */
void DFS(int i){
	if(num_p == k){
		count++;
		return;
	}

	if(i >= n)
		return;

	int j;
	for(j = 0; j < n; j++){
		if(can_place(i,j)){
			placed_c[j] = true;
			num_p++;
			DFS(i+1);
			placed_c[j] = false;
			num_p--;	
		}
	}
	DFS(i+1);//i行不放棋子
}

int main(){
	int i,j;
	while(cin >> n >> k, k != -1){
		for(i = 0; i < n; i++)
			for(j = 0; j < n; j++)
				cin >> board[i][j];	
		count = 0;
		num_p = 0;
		memset(placed_c,false,sizeof(placed_c));
		DFS(0);
		cout << count << endl;
	}
      return 0;
}
分享到:
评论
4 楼 fuliang 2009-08-02  
gedoua 写道
嗯 以前我一直是那么写代码的,就是输入一个测试一个,这回就不行了。。。我朋友说让我试试一下把所有的测试全输入试试,我的代码就运行错误了。nextChar()String包里没有这个方法吧。还有别的方法读字符吗?我的方法好麻烦。我是个初学者,不好意思打扰您拉。

nextChar()是Scanner的方法,不是String里边的
3 楼 gedoua 2009-08-02  
嗯 以前我一直是那么写代码的,就是输入一个测试一个,这回就不行了。。。我朋友说让我试试一下把所有的测试全输入试试,我的代码就运行错误了。nextChar()String包里没有这个方法吧。还有别的方法读字符吗?我的方法好麻烦。我是个初学者,不好意思打扰您拉。
2 楼 fuliang 2009-08-02  
gedoua 写道
java不行是因为把测试数据一下全部输入会出现错误。。。我也遇到这个问题了,但是不知道怎么输入才对,您能帮我写一下吗?就写输入部分就行,谢谢了,我的很多poj题都是java写的,算法都对,就是这个输入,头疼!!!希望您能给我解答谢谢了

为什么一次把所有的测试数据读入呢?
acm的题目都是每次读入一个测试数据 然后输出结果的,而不是读入所有的测试数据,然后再依次的输出结果的。
像这个题目用java读入就可以改成:
Scanner sc = new Scanner(System.in);
while(true){
  n = sc.nextInt();
  k = sc.nextInt();
  if(k == -1)
    break;
  for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++){
       borad[i][j] = sc.nextChar();
    }
    sc.nextChar();//滤过换行
  }
  //..
}
1 楼 gedoua 2009-08-02  
java不行是因为把测试数据一下全部输入会出现错误。。。我也遇到这个问题了,但是不知道怎么输入才对,您能帮我写一下吗?就写输入部分就行,谢谢了,我的很多poj题都是java写的,算法都对,就是这个输入,头疼!!!希望您能给我解答谢谢了

相关推荐

    POJ1321棋盘问题

    "POJ1321棋盘问题" POJ1321棋盘问题是一种经典的回溯法问题,目的是在一个给定的棋盘形状上摆放k个棋子,使得任意两个棋子不能放在同一行或者同一列。该问题可以通过回溯法来解决。 问题描述: 在一个给定的棋盘...

    POJ1321-Chess Problem

    【标签】"POJ 1321 Chess Problem" 进一步强调了这是一道与棋盘游戏相关的算法题目,POJ编号1321是该问题在系统中的唯一标识,方便参赛者查找和提交代码。 【文件列表】: 1. "POJ1321-Chess Problem.cpp":这是一...

    POJ1753-Flip Game

    "Flip Game" 是一个二人博弈类问题,玩家轮流操作,每次可以选择棋盘上任意一行或一列的一个方格进行翻转,使得该方格和其相邻的同色方格全部变为另一种颜色。游戏的目标是通过有限次翻转使棋盘上所有方格变为指定...

    poj 百练 题目分类

    在 POJ 百练 题目分类中,简单计算类题目包括鸡兔同笼(2750)、棋盘上的距离(1657)、校门外的树(2808)、填词(2801)、装箱问题(1017)、平均年龄(2714)、数字求和(2796)、两倍(2807)、肿瘤面积(2713)...

    POJ1027-The Same Game

    【标签】"POJ 1027 The Same Game"指明了这个问题在POJ平台上的编号和名称,方便参赛者搜索和讨论。 【文件名称列表】 - "POJ1027-The Same Game.cpp":这是C++语言编写的源代码文件,包含了AC代码的实现。代码中...

    poj2488.rar_poj24_poj2488_方向模板法

    对于“方向模板法”,这可能是一种特定的搜索策略,可能是针对特定问题的优化,例如在二维数组或矩阵中移动时,按照特定的方向(如右、下、左、上)进行搜索,或者在棋盘类问题中,沿着特定的棋步方向进行探索。...

    北大POJ2243Knight Moves

    【北大POJ2243Knight Moves】是一个典型的图论问题,主要涉及到国际象棋中的马(Knight)的移动规则以及最短路径的计算。在国际象棋中,马每一步可以向前后各跳两格,然后横向或纵向跳一格,形成一个“L”形的移动...

    poj1005.zip_北大poj1005

    10. **回溯法与剪枝**:用于解决约束满足问题,如八皇后问题、N皇后问题、棋盘覆盖问题等。 在解决POJ1005这个问题时,参赛者需要结合题目给出的具体要求,选择合适的算法和数据结构,编写高效、正确的程序。同时,...

    POJ2488-A Knight's Journey【骑士游历】

    题目要求解决的是一个典型的图论问题,即在国际象棋棋盘上,骑士能否通过特定步数到达所有位置至少一次,即实现骑士的全访问路径。在这个问题中,我们需要理解并应用以下几个关键知识点: 1. **骑士移动规则**:在...

    poj.grids.cn题型分类

    棋盘分割问题通常涉及将一个棋盘分割成若干个小区域,要求每个小区域满足一定的条件。可以通过动态规划定义状态`dp[i][j]`表示分割到第`i`行第`j`列时的方案数或最小代价。 ##### 6. 日程安排问题 日程安排问题...

    图的深搜+回溯练习题:POJ2197

    在解决组合优化问题、棋盘游戏等场景中,回溯法常被用来穷举所有可能的解,并在找到有效解后停止搜索。在图的某些问题中,如八皇后问题、迷宫求解等,回溯法可以结合DFS一起使用,形成一种有效的解决方案。 在题目...

    poj水题部分代码

    这些问题分别涉及了POJ(Problem Online Judge)平台上的一些题目,使用的编程语言为C++。下面将逐一解析这些题目及其解决方法。 ### 一、红与黑 **题目描述**: 此题涉及到一个二维数组`floor`,用来模拟某种棋盘...

    马周游路线问题的两种新解法

    这个问题也被称为“骑士巡逻问题”(Knight's Tour),其中“骑士”代表棋盘上的马,而“巡逻”则代表了马在棋盘上的路径。 棋盘上马的移动规则是“日”字形,即它可以移动到当前位置的横向两格、纵向一格的位置,...

    北大POJ新手入门题源文件大全

    9. **递归与回溯**:这两者常用于解决复杂的问题,例如棋盘游戏、迷宫问题、排列组合等。 10. **调试技巧**:学会使用调试工具,理解错误信息,逐步调试程序,是编程学习过程中的重要技能。 11. **效率优化**:...

    初学者练题开始------在POJ上(注:是百练)

    - **棋盘分割**(9.10 练习题):可能需要处理二维空间中的几何分割问题,涉及图论或深度优先搜索。 这些题目覆盖了算法基础、数学应用、数据结构、逻辑推理等多个方面,通过解决这些题目,初学者可以逐步建立编程...

    一些poj题目

    笔者本人写的一些代码,供大家参考. 包括但不限于镜子迷宫、棋盘问题、最长上升子序列、jungle roads gone fishing、nested dolls、paid roads、red and black等等 绝大部分是数据结构与算法课的作业

    算法艺术与信息学竞赛

    书中给出了45道动态规划题目,包括【POJ1141】括号序列、【POJ1191】棋盘分割等,这些都是经典的动态规划问题。括号序列问题要求最少添加括号使得序列成为规则序列,可以通过状态d[i, j]表示子串i...j需要添加的最少...

    状态压缩DP

    这个问题同样涉及到棋盘上的放置问题,但这次是放置炮兵。与之前的例子类似,可以使用状态压缩技术来简化问题,并通过动态规划找到最优解。 **3. poj1753** 该题是关于在棋盘上放置棋子的问题,每个格子可以放置或...

    算法实验报告

    一、分治算法实验 - 棋盘覆盖问题 分治算法是一种解决问题的有效策略,它将复杂的问题分解为相同或相似的小问题,然后递归地解决这些小问题,最后将子问题的解合并得到原问题的解。在这个实验中,具体应用在棋盘...

    北大acm 1915 Knight Moves C++语言源代码

    在本题目中,“北大 ACM JudgeOnline poj1915 Knight Moves”要求解决的是一个经典的骑士行走问题。具体来说,题目背景提到了一位自称无人能及的国际象棋高手Mr. Somurolov,他声称没有人能够像他那样快速地移动骑士...

Global site tag (gtag.js) - Google Analytics