深度优先搜索

作业介绍

#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int n,a[N],book[N];
void dfs(int x){
	//现在想放第x个数
	if(x>n){
		for(int i=1;i<=n;i++){
			printf("%5d",a[i]);
		}
		printf("\n");
		return;
	}
	for(int i=1;i<=n;i++){
		if(book[i]==0){
			a[x] = i;
			book[i] = 1;
			dfs(x+1);
			book[i] = 0;
		}
	}
}
int main(){
	cin>>n;
	dfs(1);
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 25;
int n,a[N],book[N],k;
void dfs(int x,int id){
	if(x>k){
		for(int i=1;i<=k;i++){
			cout<<setw(3)<<a[i];
		}
		cout<<endl;
		return;
	}
	for(int i=id+1;i<=n;i++){
		if(book[i]==0){
			a[x] = i;
			book[i] = 1;
			dfs(x+1,i);
			book[i] = 0;
		}
	}
}
int main(){
	cin>>n>>k;
	dfs(1,0);
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 25;
int n,k,a[N],step[N];
int book[N],res;
int isprime(int x){
	if(x==0 || x==1)return 0;
	for(int i=2;i*i<=x;i++){
		if(x%i==0)return 0;
	}
	return 1;
}
void dfs(int x,int id){
	if(x>k){
		int sum = 0;
		for(int i=1;i<=k;i++){
			sum+=step[i];
		}
		if(isprime(sum))res++;
		return;
	}
	for(int i=id+1;i<=n;i++){
		if(book[i]==0){
			step[x] = a[i];
			book[i] = 1;
			dfs(x+1,i);
			book[i] = 0;
		}
	}
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	dfs(1,0);
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n,a[10];
void dfs(int x,int sum,int id){
	if(sum==n){
		for(int i=1;i<x;i++){
			if(i==1)cout<<a[i];
			else cout<<"+"<<a[i];
		}
		cout<<endl;
		return;
	}
	//if(x>n)return;
	for(int i=id;i<n;i++){
		if(sum+i<=n){
			a[x] = i;
			dfs(x+1,sum+i,i);
		}
	}
}
int main(){
	cin>>n;
	dfs(1,0,1);
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n,m,book[N][N],cnt;
char mat[N][N];
int nxt[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y){
	for(int i=0;i<4;i++){
		int nx = x+nxt[i][0];
		int ny = y+nxt[i][1];
		if(nx>=1 && nx<=n && ny>=1 && ny<=m){
			if(mat[nx][ny]!='0' && book[nx][ny]==0){
				book[nx][ny] = 1;
				dfs(nx,ny);
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>mat[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(mat[i][j]!='0' && book[i][j]==0){
				cnt++;
				book[i][j] = 1;
				dfs(i,j);
			}
		}
	}
	cout<<cnt<<endl;
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N = 1505;
int n,m,book[N][N],cnt[100005],tot;//cnt[i]星星数量为i的星座的个数
char mat[N][N];
int nxt[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};
void dfs(int x,int y){
	for(int i=0;i<8;i++){
		int nx = x+nxt[i][0];
		int ny = y+nxt[i][1];
		if(nx>=1 && nx<=n && ny>=1 && ny<=m){
			if(mat[nx][ny]=='*' && book[nx][ny]==0){
				book[nx][ny] = 1;
				tot++;
				dfs(nx,ny);
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>mat[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(mat[i][j]=='*' && book[i][j]==0){
				book[i][j] = 1;
				tot = 1;
				dfs(i,j);
				cnt[tot]++;
			}
		}
	}
	int res1=0,res2=0;
	for(int i=1;i<=100000;i++){
		if(cnt[i]>0){
			res1++;
			res2 = max(res2,i*cnt[i]);
		}
	}
	cout<<res1<<" "<<res2<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
int T,n,m;
int mat[10][10];
int book[10][10];
int nxt[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1},res;
void dfs(int x,int y,int sum){
	res = max(res,sum);
	if(x>n)return;
	if(y>m){
		dfs(x+1,1,sum);
		return;
	}
	//1.取
	if(book[x][y]==0){
		for(int i=0;i<8;i++){
			int nx = x+nxt[i][0];
			int ny = y+nxt[i][1];
			if(nx>=1 && nx<=n && ny>=1 && ny<=m){
				book[nx][ny]++;
			}
		}
		dfs(x,y+1,sum+mat[x][y]);
		for(int i=0;i<8;i++){
			int nx = x+nxt[i][0];
			int ny = y+nxt[i][1];
			if(nx>=1 && nx<=n && ny>=1 && ny<=m){
				book[nx][ny]--;
			}
		}
	}
	//不取
	dfs(x,y+1,sum);
}
int main(){
	cin>>T;
	while(T--){
		res = 0;
		cin>>n>>m;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				book[i][j] = 0;
				cin>>mat[i][j];
			}
		}
		dfs(1,1,0);
		cout<<res<<endl;
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int n,m;
char mat[N][N];
int nxt[4][2]={0,1,0,-1,1,0,-1,0};
int book[N][N],cnt;
int ans[N][N];//记录i,j所在的连通块的大小
int step[N*N][2];
void dfs(int x,int y){
	cnt++;
	step[cnt][0] = x;
	step[cnt][1] = y;
	book[x][y] = 1;
	for(int i=0;i<4;i++){
		int nx = x+nxt[i][0];
		int ny = y+nxt[i][1];
		if(nx>=1 && nx<=n && ny>=1 && ny<=n){
			if(book[nx][ny]==0 && mat[nx][ny]!=mat[x][y]){
				dfs(nx,ny);
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>mat[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(book[i][j]==0){
				cnt = 0;
				dfs(i,j);
				//cout<<i<<" "<<j<<" "<<cnt<<endl;
				for(int k=1;k<=cnt;k++){
					ans[step[k][0]][step[k][1]] = cnt;
					//ans[x][y] = cnt
				}
			}
		}
	}
	while(m--){
		int x,y;
		cin>>x>>y;
		cout<<ans[x][y]<<endl;
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N =15;
int mat[N][N],n,cnt;
int check(int x,int y){
	//判断xy放旗子是否合法
	//1.判断上面
	for(int i=1;i<x;i++){
		if(mat[i][y]==1)return 0;
	}
	//2.判断左上角
	int i=x-1,j=y-1;
	while(i>=1 && j>=1){
		if(mat[i][j]==1)return 0;
		i--;j--;
	}
	//3.判断右上角
	i=x-1,j=y+1;
	while(i>=1 && j<=n){
		if(mat[i][j])return 0;
		i--;j++;
	}
	return 1;
}
void dfs(int x){
	if(x>n){
		cnt++;
		if(cnt<=3){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					if(mat[i][j]){
						cout<<j<<" ";
					}
				}
			}
			cout<<endl;
		}
		return;
	}
	for(int i=1;i<=n;i++){
		if(check(x,i)==1){
			mat[x][i] = 1;
			dfs(x+1);
			mat[x][i] = 0;
		}
	}
}
int main(){
	cin>>n;
	dfs(1);
	cout<<cnt<<endl;
	return 0;
}
状态
已结束
题目
21
开始时间
2026-3-22 0:00
截止时间
2026-3-30 23:59
可延期
24 小时