搜索题
Posted w-w-t
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索题相关的知识,希望对你有一定的参考价值。
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;
}
以上是关于搜索题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 BottomNavigationView 的片段上打开搜索界面?
《安富莱嵌入式周报》第279期:强劲的代码片段搜索工具,卡内基梅隆大学安全可靠C编码标准,Nordic发布双频WiFi6 nRF7002芯片
Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段