//给定整数a1,a2,...,an,判断是否可以从中选出若干数,使它们的和恰好为k。 //限制条件:1 <= n <= 20; //样例: //输入:n = 4 a = {1,2,4,7} k = 13 //输出:Yes
#include<iostream> usingnamespace std; int n,k,i = 0; int a[25]; intmain(){ cout << "n = "; cin >> n; cout << "a = {"; while (cin >> a[i]) { i++; if (i == n) break; } cout << "k = "; cin >> k; //使用深搜方法 booldfs(int i, int sum); if (dfs(0, 0)) cout << "Yes" << endl; else cout << "No" << endl; system("pause"); return0;
} //从a1开始决定每个数加不加到sum里,等n个数全部都决定后,再判断是否等于k booldfs(int i,int sum){ if (i == n) //穷竭后判断是否等于k return sum == k; if (dfs(i + 1, sum))//不加上a[i]的情况,判断最终是否等于k returntrue; if (dfs(i + 1, sum + a[i]))//加上a[i]的情况,判断是否等于k returntrue; returnfalse;//无论加不加,都不等于k,返回false }
#include<iostream> usingnamespace std; int n, m; int cont = 0; int map[100][100];//地图数组 intmain(){ cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf_s("%1d",& map[i][j]);//使用scanf是因为可以控制读入的位数 } } voiddfs(int x, int y); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (map[i][j] != 0) { // dfs(i, j); cont++; }
} } printf("%d", cont); return0; } //搜寻map[x][y]紧邻的所有数字,将他们全部变为0 voiddfs(int x, int y){ int dx[]{ 0,0 ,1,-1}; int dy[]{ 1,-1,0,0 };//方位数组 map[x][y] = 0; //赋值0 for (int i = 0; i < 4; i++) { x += dx[i]; y += dy[i]; if (map[x][y] != 0 && x >= 0 && x < n && y >= 0 && y < m) { dfs(x, y); //如果转变状态后,没有超过边界,并且不等于0,就继续深搜 } x -= dx[i]; //直到超过边界,或者遇到0数字,就回溯 y -= dy[i]; } }
//输入样例: //4 5 //00000 //00*00 //0*0*0 //00*00 //输出样例:1 #include<iostream> usingnamespace std; char map[510][510];//地图char型数组 int m, n, cont = 0; int dx[4]{ 0,0,1,-1 }; int dy[4]{ 1,-1,0,0 };//方位数组 voiddfs(int x, int y){ if (x < 0 || y < 0 || x > m + 1 || y > n + 1 || map[x][y] == '*')//边界 //特别注意:这里为什么不是x<=0||y<=0||x>=m+1||y>=n+1,因为要多深搜一圈。 return;//结束函数 map[x][y] = '*'; for (int i = 0; i < 4; i++) { dfs(x + dx[i], y + dy[i]); } }
intmain(){ cin >> m >> n; for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { cin >> map[i][j]; } } dfs(0, 0);//将*外所有的0全都变为* //注:方法一:多深搜一圈,从(0,0)开始,而不是(1,1),为保证能遍历所有*外的0。 /*方法二:每条边都搜一遍*/ for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { if (map[i][j] == '0') cont++; } } cout << cont << endl; return0; }
//dfs第四题 Lake Counting S //由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个NxM(1 <= N <= 100; 1 <= M <= 100)网格图表示。 //每个网格中有水('W') 或是旱地('.')。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。 //约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑。 //输入格式 //第1行:两个空格隔开的整数:N 和 M 第2行到第N+1行:每行M个字符,每个字符是'W'或'.',它们表示网格图中的一排。字符之间没有空格。 //输出格式 //一行:水坑的数量 //输入样例: 输出样例:3 //10 12 //W........WW. //.WWW.....WWW //....WW...WW. //.........WW. //.........W.. //..W......W.. //.W.W.....WW. //W.W.W.....W. //.W.W......W. //..W.......W.
#include<iostream> usingnamespace std;
char ma[110][110];//地图数组 int m, n; int cont = 0; voiddfs(int x, int y){ if (x < 0 || x >= m || y < 0 || y >= n || ma[x][y] == '.')//边界 return; ma[x][y] = '.'; int dx[]{ 0,0,1,1,1,-1,-1,-1 };//方位数组 int dy[]{ 1,-1,0,-1,1,1,0,-1 }; for (int i = 0; i < 8; i++) { dfs(x + dx[i], y + dy[i]); } }
intmain(){ cin >> m >> n; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> ma[i][j]; } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (ma[i][j] == 'W') { cont++; dfs(i, j); }