zoukankan      html  css  js  c++  java
  • DFS/BFS

    Sudoku Killer

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int zeroNum;
    int map[9][9];
    int zero[81][2];         // 存储空位坐标,dfs直接搜索这些位置
    
    void print()
    {
        for(int i = 0; i < 9; i++)
        {
            for(int j = 0; j < 9; j++)
            {
                printf("%d", map[i][j]);
                if(j==8) printf("
    ");
                else printf(" ");
            }
        }
    }
    bool check(int cnt)                            
    {
        int row = zero[cnt][0];
        int col = zero[cnt][1];
        int subRowStart = row/3 * 3;
        int subColStart = col/3 * 3;
    
        for(int i = 0; i < 9; i++)
        {
            if(map[row][i]==map[row][col] && i!=col)
                return false;
            if(map[i][col]==map[row][col] && i!=row)
                return false;
        }
        for(int i = subRowStart; i < subRowStart+3; i++)
        {
            for(int j = subColStart; j < subColStart+3; j++)
            {
                if(map[i][j]==map[row][col] && (i!=row || j!=col))
                    return false;
            }
        }
        return true;
    }
    void dfs(int cnt)            // cnt代表dfs深度
    {
        int row = zero[cnt][0];
        int col = zero[cnt][1];
    
        if(cnt > zeroNum)        // 找到可行解,打印输出
        {
            print();
            return ;
        }
        for(int k = 1; k <= 9; k++)     
        {
            map[row][col] = k;          // 枚举所有情况
            if(check(cnt))              // Sodoku合法性检查
                dfs(cnt+1);             // 递归到下一层
                                 // 注意map[row][col]在递归后还原值
            map[row][col] = 0;   // 保证上层每次枚举时深层都为空值状态
        }
    }
    int main()
    {
        int num = 0;
        char s[2];
        while(scanf("%s", s)!=EOF)    
        {
            zeroNum = 0;
            memset(map, 0, sizeof(map));
            memset(zero, 0, sizeof(zero));
    
            if(s[0] == '?')
            {
                zero[++zeroNum][0] = 0;
                zero[zeroNum][1] = 0;
                map[0][0] = 0;
            }
            else
                map[0][0] = s[0] - '0';
    
            for(int i = 0; i < 9; i++)
            {
                for(int j = 0; j < 9; j++)
                {
                    if(i || j)
                    {
                        scanf("%s", s);
                        if(s[0] == '?')
                        {
                            zero[++zeroNum][0] = i;
                            zero[zeroNum][1] = j;
                            map[i][j] = 0;
                        }
                        else
                            map[i][j] = s[0]-'0';
                    }
                }
            }
    
            if(num++) printf("
    ");     // 测试用例间空行
            dfs(1);
        }
        return 0;
    }

    Oil Deposits

    #include <queue>
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    #define N 102
    
    int cnt;
    int m, n;
    
    char map[N][N];
    int flag[N][N];
    
    int x[8] = {-1,0,1,1,1,0,-1,-1};
    int y[8] = {-1,-1,-1,0,1,1,1,0};
    int ii, jj;
    
    struct Block
    {
        int row, col;
    };
    
    bool check(int i, int j)
    {
        if(i>=0 && i<m && j>=0 && j<n)
            return true;
        else return false;
    }
    void dfs(int i, int j)
    {
        flag[i][j] = 1;
        for(int k = 0; k < 8; k++)
        {
            ii = i + x[k];
            jj = j + y[k];
            if(check(ii, jj) && map[ii][jj]=='@' && flag[ii][jj]==0)
                dfs(ii, jj);
        }
    }
    void bfs(int i, int j)
    {
        Block next, cur;
        next.row = i;
        next.col = j;
        queue<Block> q;
        q.push(next);
    
        while(!q.empty())
        {
            cur = q.front();
            q.pop();
            flag[cur.row][cur.col] = 1;
    
            for(int i = 0; i < 8; i++)
            {
                ii = cur.row + y[i];
                jj = cur.col + x[i];
                if(check(ii, jj))
                {
                    if(map[ii][jj]=='@' && flag[ii][jj]==0)
                    {
                        next.row = ii;
                        next.col = jj;
                        q.push(next);
                    }
                }
            }
        }
    }
    int main()
    {
        int i, j;
        while(scanf("%d%d", &m, &n) && m && n)
        {
            for(i = 0; i < m; i++)
            {
                for(j = 0; j < n; j++)
                    cin >> map[i][j];
            }
            memset(flag, 0, sizeof(flag));
            cnt = 0;
            for(i = 0; i < m; i++)
            {
                for(j = 0; j < n; j++)
                {
                    if(map[i][j]=='@' && flag[i][j]==0)
                    {
                        // dfs(i, j);
                        // bfs(i, j);
                        cnt++;
                    }
                }
            }
            printf("%d
    ", cnt);
        }
    }
  • 相关阅读:
    C#中使用ADOMD.NET查询多维数据集
    Expression表达式树
    SqlBulkCopy 批量复制数据到数据表
    字符串、字符、字节以及bit位小结与疑问
    C#系统委托之Action And Func
    C#中委托演变的的三个阶段
    C# 类成员备忘
    C#函数参数
    MongoDB-Getting Started with the C# Driver
    为MongoDB创建一个Windows服务
  • 原文地址:https://www.cnblogs.com/1203ljh/p/4713326.html
Copyright © 2011-2022 走看看