当前位置: 首页 > news >正文

DFS刷题

洛谷P2089烤鸡

#include<iostream>
using namespace std;
const int N = 20, M = 1000010;
int ans[N];
int dp[M][N];
int n, count;
void dfs(int x, int sum){
	if(sum > n)return;
	if(x > 10){
		if(sum == n){
			count++;
			for(int i = 1; i <= n; i++)dp[count][i] = ans[i];
		}
		return;
	}
	for(int i = 1; i <= 3; i++){
		ans[x] = i;
		dfs(x + 1, sum + i);
		ans[x] = 0; 
	}
} 
int main(){
	cin >> n;
	dfs(1, 0);
	cout << count << endl;
	for(int i = 1; i <= count; i++){
		for(int j = 1; j <= 10; j++){
			cout << dp[i][j] << " ";
		}
		cout << endl;
	}
	
	return 0;
} 

洛谷P1088火星人

next_permutation函数

#include<iostream>
#include<algorithm>
using namespace std;
int n, m;
const int N = 10010;
int a[N];

int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++)cin >> a[i];
	if(m == 0){
		for(int i = 1; i <= n; i++)cout << a[i] << " ";
	}
	while(m--){
		next_permutation(a + 1, a + n + 1);
	}
	for(int i = 1; i <= n; i++)cout << a[i] << " "; 
	
	return 0;
}

 DFS

#include<iostream>
#include<algorithm>
using namespace std;
int n, m;
const int N = 10010;
int ans[N], a[N];
bool st[N];
int cnt;
void dfs(int x){
	if(cnt >= m + 1)return;
	if(x > n){
		cnt++;
		if(cnt == m + 1){
			for(int i = 1; i <= n; i++)cout << ans[i] << " ";
		}
		return;
	}
	for(int i = 1; i <= n; i++){
		if(!cnt){
			i = a[x];
		}
		if(!st[i]){
			ans[x] = i;
			st[i] = true;
			dfs(x + 1);
			ans[x] = 0;
			st[i] = false;
		}
	}
}
int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++)cin >> a[i];
	dfs(1);
	
	return 0;
}

洛谷P1149火柴棒

#include<iostream>
#include<algorithm>
using namespace std;
int n;
const int N = 10010;
int dist[N] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int arr[4];
int ans;
void dfs(int x, int sum){
	if(sum > n)return;
	if(x > 3){
		if(arr[1] + arr[2] == arr[3] && sum == n){
			ans++;
		}
		return;
	}
	for(int i = 0; i <= 1000; i++){
		arr[x] = i;
		dfs(x + 1, sum + dist[i]);
		arr[x] = 0;
	}
}
int main(){
	cin >> n;
	n -= 4;
	for(int i = 10; i <= 10000; i++){
		dist[i] = dist[i % 10] + dist[i / 10];
	}
	dfs(1, 0);
	cout << ans << endl;
	
	return 0;
}

洛谷P2036PERKET

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
const int N = 20;
int acid[N], bitter[N];
int ans = 0x7fffffff;
bool st[N];

void dfs(int x){
	if(x > n){
		int sum1 = 1;
		int sum2 = 0;
		bool has_sc = false;
		for(int i = 1; i <= n; i++){
			if(st[i] != 0){
				has_sc = true;
				sum1 *= acid[i];
				sum2 += bitter[i];
			}
			if(has_sc)ans = min(ans, abs(sum1 - sum2));
		}
		return;
	}
	st[x] = true;
	dfs(x + 1);
	st[x] = false; 
	dfs(x + 1); 
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++)cin >> acid[i] >> bitter[i];
	dfs(1);
	cout << ans << endl;
	
	return 0;
}

洛谷P1135奇怪的电梯

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n, a, b;
const int N = 210;
int s[N];
int ans = 0x7fffffff;
bool st[N];
void dfs(int x, int cnt){
	if(cnt >= ans)return;
	if(x == b){
		ans = min(ans, cnt);
		return;
	}
	int up = x + s[x];
	if(up <= n && !st[up]){
		st[up] = true;
		dfs(x + s[x], cnt + 1);
		st[up] = false;
	}
	int down = x - s[x];
	if(down >= 1 && !st[down]){
		st[down] = true;
		dfs(x - s[x], cnt + 1);
		st[down] = false; 
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n >> a >> b;
	for(int i = 1; i <= n; i++)cin >> s[i];
	st[a] = true;
	dfs(a, 0);
	if(ans == 0x7fffffff)cout << -1 << endl;
	else cout << ans << endl;
	return 0;
}

洛谷P1683

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m;
const int N = 25;
char mp[N][N];
bool st[N][N];
int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0};
int ans = 1;
void dfs(int x, int y){
	
	for(int i = 0; i < 4; i++){
		int a = x + dx[i], b = y + dy[i];
		if(a < 1 || a > n || b < 1 || b > m)continue;
		if(mp[a][b] != '.')continue;
		if(st[a][b])continue;
		st[a][b] = true;
		ans++;
		dfs(a, b);
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> m >> n;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			cin >> mp[i][j];
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			if(mp[i][j] == '@'){
				st[i][j] = true;
				dfs(i, j);
			}
		}
	}
	cout << ans << endl;
	
	
	return 0;
}

洛谷P1596

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 110;
char g[N][N];
bool st[N][N];
int n, m;
int ans;
int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1}, dy[8] = {1, -1, 0, 0, 1, -1, 1, -1};
void dfs(int x, int y){
	for(int i = 0; i < 8; i++){
		int a = x + dx[i], b = y + dy[i];
		if(a < 1 || a > n || b < 1 || b > m)continue;
		if(st[a][b] || g[a][b] != 'W')continue;
		st[a][b] = true;
		dfs(a, b);
	}
}
int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			cin >> g[i][j];
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			if(g[i][j] == 'W' && !st[i][j]){
				ans++;
				st[i][j] = true;
				dfs(i, j);
			}
		}
	}
	cout << ans << endl; 
	
	return 0;
}

acwing1114棋盘问题

#include<iostream>
#include<cstring>
using namespace std;
int n, m;
const int N = 10;
char g[N][N];
bool col[N];
int ans;
void dfs(int x, int cnt){
    if(cnt == m){
        ans++;
        return;
    }
    if(x > n)return;
    for(int i = 1; i <= n; i++){
        if(!col[i] && g[x][i] == '#'){
            col[i] = true;
            dfs(x + 1, cnt + 1);
            col[i] = false;
        }
    }
    dfs(x + 1, cnt);
}
int main(){
    while(cin >> n >> m, (n != -1 && m != -1)){
        memset(g, 0, sizeof(g));
        ans = 0;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++){
                cin >> g[i][j];
            }
        }
        memset(col, 0, sizeof(col));
        dfs(1, 0);
        cout << ans << endl;
    }
    
    return 0;
}

洛谷P1025数的划分

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n, k;
const int N = 210;
int ans;
void dfs(int x, int cnt, int start){
	if(x > k){
		if(cnt == 0)ans++;
		return;
	}
	if(x > k || cnt < 0)return;
	for(int i = start; i <= cnt;  i++){
		dfs(x + 1, cnt - i, i);
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n >> k;
	dfs(1, n, 1);
	cout << ans << endl;
	
	return 0;
}

洛谷P1019单词接龙

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
const int N = 25;
string str[N];
int g[N][N];//g[i][j]表示第i个字符串到j个的共同部分的长度 
int used[100];
int ans;
void dfs(string dragon, int x){
	ans = max(ans, (int)dragon.size());
	used[x]++;
	for(int i = 1; i <= n; i++){
		if(g[x][i] && used[i] < 2){
			dfs(dragon + str[i].substr(g[x][i]), i);
		}
	}
	used[x]--;
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++)cin >> str[i];
	char start; cin >> start;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			for(int k = 1; k <= min(str[i].size(), str[j].size()); k++){
				string a = str[i], b = str[j];
				if(a.substr(a.size() - k, k) == b.substr(0, k)){
					g[i][j] = k;
					break;
				}
			}
		}
	}
	for(int i = 1; i <= n; i++){
		if(str[i][0] == start){
			dfs(str[i], i);
		}
	}
	cout << ans << endl;
	
	return 0;
}

相关文章:

  • 人工智能 - DeepSeek 和 Manus 的区别和应用场景
  • 数据结构之链表(双链表)
  • C语言入门教程100讲(5)基本数据类型
  • QEMU 模拟GL.iNET 路由器设备
  • C++面试准备一(常考)
  • python每日十题(6)
  • Redis学习记录
  • AF3 rot_matmul 和 rot_vec_mul函数解读
  • 【算法学习之路】13.BFS
  • 大语言模型进化论:从文本理解到多模态认知的革命之路
  • 高斯数据库-WDR Snapshot生成性能报告
  • 【商城实战(56)】商城数据生命线:恢复流程与演练全解析
  • datawhale组队学习--大语言模型—task4:Transformer架构及详细配置
  • 7. 二叉树****
  • Proteus 使用入门指南
  • Powershell WSL .wslconfig 实现与宿主机的网络互通
  • 0322-数据库、前后端
  • SSE详解面试常考问题详解
  • 基于 Vue 3 的PDF和Excel导出
  • Ubuntu22.04通过DKMS包安装Intel WiFi系列适配器(网卡驱动)
  • 【社论】个人破产探索,要守住“诚实而不幸”的底线
  • 反制美国钢铝关税!印度拟对美国部分商品征收关税
  • 宝妈称宝宝在粽子中吃出带血创可贴,来伊份:已内部排查
  • 新华时评:中国维护国际经贸秩序的立场坚定不移
  • 习近平会见古巴国家主席迪亚斯-卡内尔
  • 金地集团:今年前4个月实现销售额109.3亿元,同比下降52.44%