目录
一.深度优先搜索
1.选物品(最笨的写法)
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=30;
int n,v,maxvalue=0;
int w[maxn],c[maxn];
void dfs(int index,int sumw,int sumc){
if(index==n){
if(sumw<=v&&sumc>maxvalue){
maxvalue=sumc;
}
return;
}
dfs(index+1,sumw,sumc);
dfs(index+1,sumw+w[index],sumc+c[index]);
}
int main(){
scanf("%d%d",&n,&v);
for(int i=0;i<n;i++){
scanf("%d",&w[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&c[i]);
}
dfs(0,0,0);
printf("%d\n",maxvalue);
return 0;
}
2.剪枝
int ans=0;
void dfs_better(int index,int sumw,int sumc){
if(index==n){
return;
}
dfs(index+1,sumw,sumc);
if(sumw+w[index]<=v){
if(sumc+c[index]>ans){
ans=sumc+c[index];
}
dfs(index+1,sumw+w[index],sumc+c[index]);
}
}
3.选数
int n,k,x,maxsumsqu=-1,a[maxn];
vector<int> temp,ans;
void dfs(int index,int nowk,int sum,int sumsqu){
if(nowk==k&&sum==x){
if(sumsqu>maxsumsqu){
maxsumsqu=sumsqu;
ans=temp;
}
return;
}
if(index==n||nowk>k||sum>x) return;
temp.push_back(A[index]);
dfs(index+1,nowk+1,sum+a[index],sumsqu+a[index]*a[index]);
temp.pop_back();
dfs(index+1,nowk,sum,sumsqu);
}
4.Integer Factorization
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int n,k,p,maxfacsum=-1;
vector<int> fac,ans,temp;
int power(int x){
int ans=1;
for(int i=0;i<p;i++){
ans*=x;
}
return ans;
}
void init(){
int i=0,temp=0;
while(temp<=n){
fac.push_back(temp);
temp=power(++i);
}
}
void dfs(int index,int nowk,int sums,int facsum){
if(sums==n&&nowk==k){
if(facsum>maxfacsum){
ans=temp;
maxfacsum=facsum;
}
return;
}
if(sums>n||nowk>k) return;
if(index>0){
temp.push_back(index);
dfs(index,nowk+1,sums+fac[index],facsum+index);
temp.pop_back();
dfs(index-1,nowk,sums,facsum);
}
}
int main(){
scanf("%d%d%d",&n,&k,&p);
init();
dfs(fac.size()-1,0,0,0);
if(maxfacsum==-1) printf("Impossible\n");
else{
printf("%d = %d^%d",n,ans[0],p);
for(int i=1;i<ans.size();i++){
printf(" + %d^%d",ans[i],p);
}
}
return 0;
}
二.广度优先搜索
1.BFS迷宫
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=100;
struct nodes{
int x,y;
int step;
}s,t,node;
int n,m;
char maze[maxn][maxn];
bool inq[maxn][maxn] = {false};
int x[4] ={0,0,1,-1};
int y[4] = {1,-1,0,0};
bool test(int x,int y){
if(x>=n||x<0||y>=m||y<0) return false;
if(maze[x][y]='*') return false;
if(inq[x][y]==true) return false;
return true;
}
int bfs(){
queue<nodes> q;
q.push(s);
while(!q.empty()){
nodes top=q.front();
q.pop();
if(top.x==t.x&&top.y==t.y){
return top.step;
}
for(int i=0;i<4;i++){
int newx=top.x+x[i];
int newy=top.y+y[i];
if(test(newx,newy)){
node.x=newx,node.y=newy;
node.step=top.step+1;
q.push(node);
inq[newx][newy] = true;
}
}
}
return -1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
getchar();
for(int j=0;j<m;j++){
maze[i][j]=getchar();
}
maze[i][m+1] ='\0';
}
scanf("%d%d%d%d",&s.x,&s.y,&t.x,&t.y);
s.step=0;
printf("%d\n",bfs());
return 0;
}
2.Acute Stroke
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
struct nodes{
int x,y,z;
}node;
int n,m,slice,t;
int pixel[1290][130][61];
bool inq[1290][130][61] ={false};
int xs[6] ={0,0,0,0,1,-1};
int ys[6] ={0,0,1,-1,0,0};
int zs[6] ={1,-1,0,0,0,0};
bool judge(int x,int y,int z){
if(x>=n||x<0||y>=m||y<0||z>=slice||z<0) return false;
if(pixel[x][y][z]==0||inq[x][y][z]==true) return false;
return true;
}
int bfs(int x,int y,int z){
int tot=0;
queue<nodes> q;
node.x=x,node.y=y,node.z=z;
q.push(node);
inq[x][y][z] = true;
while(!q.empty()){
nodes top=q.front();
q.pop();
tot++;
for(int i=0;i<6;i++){
int newx=top.x+xs[i];
int newy=top.y+ys[i];
int newz=top.z+zs[i];
if(judge(newx,newy,newz)){
node.x=newx,node.y=newy,node.z=newz;
q.push(node);
inq[newx][newy][newz] = true;
}
}
}
if(tot>=t) return tot;
else return 0;
}
int main(){
scanf("%d%d%d%d",&n,&m,&slice,&t);
for(int z=0;z<slice;z++){
for(int x=0;x<n;x++){
for(int y=0;y<m;y++){
scanf("%d",&pixel[x][y][z]);
}
}
}
int ans=0;
for(int z=0;z<slice;z++){
for(int x=0;x<n;x++){
for(int y=0;y<m;y++){
if(pixel[x][y][z]==1&&inq[x][y][x]==false){
ans+=bfs(x,y,z);
}
}
}
}
printf("%d\n",ans);
return 0;
return 0;
}