zoukankan      html  css  js  c++  java
  • POJ1321棋盘问题

    棋盘问题
    Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u

    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
    ...#
    ..#.
    .#..
    #...
    -1 -1
    


    这个题目的大意就是向棋盘'#'中添加棋子,如果一个棋盘上有了棋子的话,那它横竖都不会再接受棋子的放置
    简单的暴力DFS就可以,对已经放置棋子的行列进行标记。代码如下
    /*************************************************************************
        > File Name: 棋盘问题.c
        > Author: zhanghaoran
        > Mail: 467908670@qq.com 
        > Created Time: 2015年06月01日 星期一 15时19分35秒
     ************************************************************************/
    
    #include <stdio.h>
    #include <string.h>
    
    
    char chess[10][10];
    int flag[10][10];
    int num;
    int n, l;
    
    int dfs(int nx, int ny, int step){
    	int i, j, k, t;
    	if(step == l){
    		num ++;
    		return 1;
    	}
    	for(i = nx; i < n; i ++){
    		for(j = (i == nx ? ny : 0); j < n; j ++){
    			if(!flag[i][j] && chess[i][j] == '#'){
    				int nflag[10][10];
    				memset(nflag, 0, sizeof(nflag));
    				for(k = 0; k < n; k ++)
    					for(t = 0; t < n; t ++)
    						nflag[k][t] = flag[k][t];
    				for(k = 0; k < n; k ++){
    					flag[i][k] = 1;
    					flag[k][j] = 1;
    				}
    				dfs(i, j, step + 1);
    				for(k = 0; k < n; k ++)
    					for(t = 0; t < n; t ++)
    						flag[k][t] = nflag[k][t];
    			} 
    		}
    	}
    }
    
    int main(void){
    	int i , j;
    	while(1){
    		scanf("%d %d", &n, &l);
    		memset(chess, 0, sizeof(chess));
    		getchar();
    		if(n == -1)
    			break;
    		memset(flag, 0, sizeof(flag));
    		for(i = 0; i < n; i ++){
    			for(j = 0; j < n; j ++){
    				scanf("%c", &chess[i][j]);
    			}
    			getchar();
    		}
    		num = 0;
    		dfs(0, 0, 0);
    		printf("%d
    ",num);
    	}
    	return 0;
    }



  • 相关阅读:
    了解 Spring Data JPA
    Spring MVC 方法注解拦截器
    Spring MVC拦截器+注解方式实现防止表单重复提交
    java中return语句的用法总结
    equal方法在String类与Object类中的区别
    instanceof用法
    EL 简介及用法
    JAVA 四大域对象总结
    JSP基本语法
    Servlet请求转发 RequestDispatcher接口知识点
  • 原文地址:https://www.cnblogs.com/chilumanxi/p/5136140.html
Copyright © 2011-2022 走看看