zoukankan      html  css  js  c++  java
  • DFS的一些题2020/3/11

    1.

    Sample Input
    6 9
    ....#.
    .....#
    ......
    ......
    ......
    ......
    ......
    #@...#
    .#..#.
    11 9
    .#.........
    .#.#######.
    .#.#.....#.
    .#.#.###.#.
    .#.#..@#.#.
    .#.#####.#.
    .#.......#.
    .#########.
    ...........
    11 6
    ..#..#..#..
    ..#..#..#..
    ..#..#..###
    ..#..#..#@.
    ..#..#..#..
    ..#..#..#..
    7 7
    ..#.#..
    ..#.#..
    ###.###
    ...@...
    ###.###
    ..#.#..
    ..#.#..
    0 0
    Sample Output
    45
    59
    6
    13
    

     求解代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 100;
    bool vis[100][100];
    int ans = 0;
    char a[100][100];
    void DFS(int x, int y) {
    	int dir[10] = {0, 0, 1, 0, -1, 1, 0, -1, 0};
    	for(int i = 1; i <= 8; i+=2) {
    		int temp1 = x, temp2 = y;
    		temp1 += dir[i];
    		temp2 += dir[i + 1];
    		if(temp1 >= 0 && temp2 >= 0 && a[temp1][temp2] == '.' && !vis[temp1][temp2]) {
    			ans++;
    			a[temp1][temp2] = '!';
    			vis[temp1][temp2] = 1;
    			DFS(temp1, temp2);
    		}
    	}
    }
    
    int main () {
    	int m, n;
    	while(cin >> m >> n) {
    		memset(a, 0, sizeof a);
    		memset(vis, 0, sizeof vis);
    		ans = 0;
    		if(m == 0 && n == 0) {
    			break;
    		}
    		for(int i = 0; i < n; ++i) {
    			cin >> a[i];
    		}
    		int x, y;
    		for(int i = 0; i < n; ++i) {
    			for(int j = 0; j < m; ++j) {
    				if(a[i][j] == '@') {
    					x = i;
    					y = j;
    				}
    			}
    		}
    		//cout << x << y << endl;
    		DFS(x, y);
    		cout << ans + 1 << endl;
    	}
    }
    

    2.

    Sample Input
    3 4 5
    3 2
    2 2
    3 1
    2 3
    1 1
    Sample Output
    4
    //POJ 3620
    #include <iostream>
    using namespace std;
    bool vis[110][110];
    char a[110][110];
    int ans;
    int n, m, k;
    int temp;
    int DFS(int x, int y) {
    	temp++;
    	int dir[10] = {0, 1, 0, -1, 0, 0, 1, 0, -1};
    	for(int i = 1; i <= 8; i += 2) {
    		vis[x][y] = 1;	//标记之前的点
    		int temp1 = x + dir[i];
    		int temp2 = y + dir[i + 1];
    		if(temp1 >= 1 && temp2 >= 1 && temp1 <= m && temp2 <= n && !vis[temp1][temp2] && a[temp1][temp2] == '#') {
    			DFS(temp1, temp2);
    		}
    	}
    	return temp; 
    }
    int main () {
    	//memset(a, '0', sizeof a);
    	cin >> m >> n >> k;
    	ans = 0;
    	while(k--) {
    		int x, y;
    		cin >> x >> y;
    		a[x][y] = '#';
    	}
    	// for(int i = 1; i <= n; ++i) {
    	// 	for(int j = 1; j <= m; ++j) {
    	// 		cout << a[i][j];
    	// 	}
    	// 	cout << endl;
    	// }
    	for(int i = 1; i <= m; ++i) {
    		for(int j = 1; j <= n; ++j) {
    			if(!vis[i][j] && a[i][j] == '#') {
    				temp = 0;
    				DFS(i, j);
    				if(temp > ans) {
    					ans = temp;
    				}
    			}
    		}
    	}
    	cout << ans << endl;
    }
    

     3.

    //洛谷1605
    #include <bits/stdc++.h>
    using namespace std;
    bool vis[10][10];
    char a[10][10];
    int ans;
    int sx, sy, ex, ey;
    int n, m, t;
    void DFS(int x, int y) {
    	int dir[10] = {0, 1, 0, -1, 0, 0, 1, 0, -1};
    	if(x == ex && y == ey) {
    		ans++;
    		return;
    	}
    	for(int i = 1; i <= 8; i += 2) {
    		vis[x][y] = 1;	//标记之前的点
    		int temp1 = x + dir[i];
    		int temp2 = y + dir[i + 1];
    		if(temp1 >= 1 && temp2 >= 1 && temp1 <= n && temp2 <= m && !vis[temp1][temp2] && a[temp1][temp2] != '#') {
    			DFS(temp1, temp2);
    			vis[temp1][temp2] = 0;
    			//进行回溯
    		}
    	}
    }
    int main () {
    
    	cin >> n >> m >> t;
    	cin >> sx >> sy >> ex >> ey;
    	ans = 0;
    	while(t--) {
    		int x, y;
    		cin >> x >> y;
    		a[x][y] = '#';
    	}
    	DFS(sx, sy);
    	cout << ans << endl;
    }
    
    作者:LightAc
    出处:https://www.cnblogs.com/lightac/
    联系:
    Email: dzz@stu.ouc.edu.cn
    QQ: 1171613053
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    The C++ Source A Pause to Reflect: Five Lists of Five, Part I The Most Important C++ Books...Ever
    Cg 1.5 Released
    Half Life 2 Source 引擎介绍
    一大清早去飙车
    [旧闻一]NVIDIA招揽前Intel顶级CPU设计师
    [旧闻二]AMD收购ATI
    【翻译】[Effective C++第三版•中文版][第17条]要在单独的语句中使用智能指针来存储由new创建的对象
    Generic:简化异常安全代码
    第29条: 力求使代码做到“异常安全”
    Linux压缩打包命令使用方法
  • 原文地址:https://www.cnblogs.com/lightac/p/12466973.html
Copyright © 2011-2022 走看看