码迷,mamicode.com
首页 > 其他好文 > 详细

poj1321__棋盘问题

时间:2017-06-26 00:37:44      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:修炼   记录   code   set   iostream   eof   names   while   简单   

题目地址:http://poj.org/problem?id=1321

 

题目大意:给定正方形棋盘的边长与棋子数目,棋盘内只有特定形状的位置能放棋子,要求计算出将每个棋子以不同列不同行的方式放在能放棋子的位置的方案总数。

 

how:简单的深搜,确定好递归条件和函数弹回条件。

#include<stdio.h>
#include<string.h>
#include<iostream>

using namespace std;

char a[500][500];
int flag[500];

int n,k,m;//m是已经放了的棋子数目
int ans;

void dfs(int s){
    if(k==m){
        ans++;
        return;
    }
    if(s>=n)
        return;//以上两条都是回弹条件
    for(int j=0;j<n;j++)
    if(flag[j]==0&&a[s][j]==#){//递归的条件,一般深搜我喜欢用标志数组记录访问过的位置,并且在回弹后,清楚访问记录
        m++;
        flag[j]=1;
        dfs(s+1);
        flag[j]=0;
        m--;
    }
    dfs(s+1);//另起一行

}
int main(){

    while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1){
            m=0;
            ans =0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cin>>a[i][j];
            }
        }
        memset(flag,0,sizeof(flag));
        dfs(0);
        cout<<ans<<endl;
    }
}

暑假修炼之路,从水题开始做起~

poj1321__棋盘问题

标签:修炼   记录   code   set   iostream   eof   names   while   简单   

原文地址:http://www.cnblogs.com/jokerspace/p/7078549.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!