1.小猫爬山
https://ac.nowcoder.com/acm/problem/51012
注意1:切记 在定义的data vector固定了大小的情况下一定要谨慎使用sort函数 因为有许多没有数据的0值 所以容易出错
注意2.切记在cin>>data【i】的时候一定要定义data的大小
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N,W;
vector<int>cat(20);
int minc=20;
int gract[20];
void dfs(int t,int cur){
if(cur>=minc){return;}
if(t>N){
minc=min(minc,cur);
return;
}
for(int i=1;i<=cur;i++){
if(gract[i]+cat[t]<=W){
gract[i]+=cat[t];
dfs(t+1,cur);
gract[i]-=cat[t];
}
}
gract[cur+1]=cat[t];
dfs(t+1,cur+1);
gract[cur+1]=0;
}
int main(){
cin>>N>>W;
for(int i=1;i<=N;i++){
cin>>cat[i];
}
dfs(1,1);
cout<<minc<<endl;
return 0;
}
小猫上车问题 如果以小猫考虑船 很难想 因为你不知道有多少船 也不知道每只猫上那条船
但是用船来考虑就好办 因为第一只猫,第二只猫都要上某条船 猫数t增加 来循环找船上 即可
如果循环到第t只猫的时候一遍下来都没有船装得下 那么就增加一条船 并且把这只猫放上去 因为前面的都放不下的话 这只猫一定要上新加的船
注意3:对于抓着每一只猫选船的时候 选起之后dfs下一只猫 但是后面要注意一定把这只猫取下来(因为这只猫不一定只可以上这条船 所以一定注意还原现场,在进行下一次循环)
2.工厂零件问题
20200809字节跳动笔试题4题
自己写的
#include<iostream>
#include<vector>
using namespace std;
int N;
int P;
vector<int>factory(100000);
vector<int>product(100000);
int count=0;
void dfs(int t,int st,int &count){
if(t>N){
count++;
return ;
}
for(int i=st;i<=N;i++){
if(factory[i]>=product[t]){
dfs(t+1,i+1,count);
}
}
return;
}
int main(){
cin>>N;
int temp;
for(int i=1;i<=N;i++){
cin>>factory[i];
}
for(int i=1;i<=N;i++){
cin>>product[i];
}
cin>>P;
dfs(1,1,count);
cout<<count<<endl;
return 0;
}
3.soduko 数独
https://ac.nowcoder.com/acm/contest/1014/B
#include<iostream>
#include<vector>
using namespace std;
char data[9][9];
bool flag=false;
void inputdata(string s){
int cur=0;
for(int row=0;row<9;row++){
for(int col=0;col<9;col++){
data[row][col]=s[cur++];
}
}
}
void outputdata(){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
cout<<data[i][j];
}
}
cout<<endl;
flag=false;
}
bool check(int n,char value){
for(int i=0;i<9;i++){
if(data[i][n%9]==value){
return false;
}
}
for(int j=0;j<9;j++){
if(data[n/9][j]==value){
return false;
}
}
int x=n/9/3*3;
int y=n%9/3*3;
for(int i=x;i<x+3;i++){
for(int j=y;j<y+3;j++){
if(data[i][j]==value){
return false;
}
}
}
return true;
}
bool dfs(int n){
if(n>80){
return true;
}
if(data[n/9][n%9]!='.'){dfs(n+1);}
else{
for(char i='1';i<='9';i++){
if(check(n,i)){
data[n/9][n%9]=i;
dfs(n+1);
if(flag==true){return true;}
data[n/9][n%9]='.';
}
}
}
}
int main(){
string s;
while(cin>>s){
if(s=="end"){return 0;;}
inputdata(s);
if(dfs(0)){outputdata();}
}
return 0;
}
对于dfs函数 需要层层返回
for(char i='1';i<='9';i++){
if(check(n,i)){
data[n/9][n%9]=i;
dfs(n+1);
if(flag==true){return true;}
data[n/9][n%9]='.';
}
}
参考文献
https://www.cnblogs.com/dancer16/p/6916795.html
这个里面的dfs为int型 只有成功才返回return0 层层返回0 这样 main函数的下一行output才可以执行