目录
1.背包
const int maxn=30;
int n,v,max_value;
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]);
}
void dfs(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]);
}
}
2.基础
const int maxn=100;
int n,k,x,maxsq=-1,a[maxn];
vector<int> temp,ans;
void dfs(int index,int nowk,int sum,int sq){
if(nowk==k&&sum==x){
if(sq>maxsq){
maxsq=sq;
ans=temp;
}
return;
}
if(index==n||nowk>k||sum>x) return;
temp.push_back(a[index]);
dfs(index+1,nowk+1,sum+a[index],sq+a[index]*a[index]);
temp.pop_back();
dfs(index+1,nowk,sum,sq);
}
3.Integer Factorization
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=500;
int n,k,p;
vector<int>fac,ans,temp;
int getf(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=getf(++i);
}
}
int maxfacsum=-1;
void dfs(int index,int numk,int sums,int facsum){
if(sums==n&&numk==k){
if(facsum>maxfacsum){
maxfacsum=facsum;
ans=temp;
}
return;
}
if(sums>n||numk>k) return;
if(index>0){
temp.push_back(index);
dfs(index,numk+1,sums+fac[index],facsum+index);
temp.pop_back();
dfs(index-1,numk,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 = ",n);
for(int i=0;i<ans.size();i++){
printf("%d^%d",ans[i],p);
if(i!=ans.size()-1) printf(" + ");
}
}
return 0;
}
4.块
const int maxn=100;
struct nodes{
int x,int y;
}node;
int n,m;
int martix[maxn][maxn];
bool inq[maxn][maxn]={false};
int x[4]={0,0,-1,1};
int y[4]={1,-1,0,0};
bool judge(int x,int y){
if(x<=0||x>=n||y>=m||y<=0) return false;
if(martix[x][y]==0||inq[x][y]==true) return false;
return true;
}
void bfs(int x,int y){
queue<nodes> q;
node.x=x,node.y=y;
q.push(node);
inq[x][y]=true;
while(!q.empty()){
node top=q.front();
q.pop();
for(int i=0;i<4;i++){
int newx=top.x+x[i];
int newy=top.y+y[i];
if(judge(newx,newy)){
node.x=x,node.y=y;
q.push(node);
inq[newx][newy]=true;
}
}
}
}
void dfs(int x,int y){
if(judge(x,y)==false) return;
else inq[x][y]=1;
for(int i=0;i<4;i++){
int newx=x+x[i];
int newy=y+y[i];
dfs(newx,newy);
}
}
5.bfs走迷宫
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=100;
struct nodes{
int x,y;
int step;
}s,t,node;
int n,m;
char martix[maxn][maxn];
bool inq[maxn][maxn]={false};
int x[4]={0,0,1,-1};
int y[4]={1,-1,0,0};
bool judge(int x,int y){
if(x>=n||x<0||y>=m||y<0) return false;
if(inq[x][y]) return false;
if(martix[x][y]=='*') 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;
else{
for(int i=0;i<4;i++){
int newx=top.x+x[i];
int newy=top.y+y[i];
if(judge(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++){
martix[i][j]=getchar();
}
martix[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;
}
6.Acute Stroke
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
struct nodes{
int x,y,z;
}node;
int n,m,l,t;
int martix[1287][129][61];
bool inq[1287][129][61]={false};
int X[6]={0,0,0,0,1,-1};
int Y[6]={0,0,1,-1,0,0};
int Z[6]={1,-1,0,0,0,0};
bool judge(int x,int y,int z){
if(x<0||x>=n) return false;
if(y<0||y>=m) return false;
if(z<0||z>=l) return false;
if(martix[x][y][z]==0) return false;
if(inq[x][y][z]==true) return false;
return true;
}
int bfs(int x,int y,int z){
int tot=0;
node.x=x,node.y=y,node.z=z;
queue<nodes> q;
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+X[i];
int newy=top.y+Y[i];
int newz=top.z+Z[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,&l,&t);
for(int z=0;z<l;z++){
for(int x=0;x<n;x++){
for(int y=0;y<m;y++){
scanf("%d",&martix[x][y][z]);
}
}
}
int ans=0;
for(int z=0;z<l;z++){
for(int x=0;x<n;x++){
for(int y=0;y<m;y++){
if(martix[x][y][z]==1&&inq[x][y][z]==false){
ans+=bfs(x,y,z);
}
}
}
}
printf("%d\n",ans);
return 0;
}