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

搜索题

时间:2020-01-29 17:50:12      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:就是   状态   ring   code   names   循环   形状   oid   初始   

1. POJ-1321

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,
请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

初始想法(wa

book[MA]//该行是否放棋子
单纯考虑在n行中取k行放棋子,以为就是一个组合问题,题意没理解就做了。
没有考虑若一行有两个'#'位置的情况,所以应该双层for循环判断每一个位置是否为'#'就好了。
for(int j=i;j<n;j++)
    for(int t=0;t<n;t++)
        if(book[j]==0&&a[j][t]=='#'){
      
        }

第二次(wa

没有考虑列的问题,大失误。加一个row[MA]存各列的状态

第三次(ac

#include<iostream>
#include<cstring>
using namespace std;
const int MA=10;
int n,k;
long long sum;
char a[MA][MA];
int book[MA];//这行是否放置棋子 
int row[MA];

void dfs(int i,int m){//第m个棋子放在 i 到 n-1 的任一满足条件行  
    if(m==k+1){
        sum++;
        return ;
    }
    for(int j=i;j<n;j++){
        for(int t=0;t<n;t++){
            if(book[j]==0&&a[j][t]=='#'&&row[t]==0){
                row[t]=1;
                book[j]=1;
                dfs(j+1,m+1);
                book[j]=0;
                row[t]=0;
            }
        }
    }
}
int main(){
    while(cin>>n>>k){
        if(n==-1&&k==-1)break;
        memset(book,0,sizeof(book));
        memset(row,0,sizeof(row));
        sum=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cin>>a[i][j];
            }
        }
        dfs(0,1);
        cout<<sum<<endl;
    }
    return 0;
}

搜索题

标签:就是   状态   ring   code   names   循环   形状   oid   初始   

原文地址:https://www.cnblogs.com/w-w-t/p/12240621.html

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