记录下第一次玩深搜的两题(DFS/回溯)

记录下第一次玩深搜的两题(DFS/回溯)_第1张图片

2.4 小z的房子

#include<iostream> 
#include<stdio.h> 
#include<string> 
using namespace std;  

int arr[200][200];  
int move[4][2] = { {-1,0} , {1,0} , {0,-1} , {0,1} };  

void DFS(int x,int y)  
{  
    arr[x][y] = 0;//搜索到的位置清零 

    int nextX,nextY;  

    for(int t=0;t<4;t++) //搜索上下左右 
    {  
        nextX = x + move[t][0];  
        nextY = y + move[t][1];  
        if(arr[nextX][nextY] == 1)  
            DFS(nextX,nextY);  
    }  
}  


int main()  
{  

    int n,m;  
    cin >> n >> m;  
    for(int i = 1; i <= n ;i++)  //从[1][1]开始存 为了避免在上下左右深搜判断时数组越界(这样外圈都是0)
    {  
        getchar();  
        for(int j = 1;j <= m;j++)  
            arr[i][j] = (getchar() == '1');  //当读入字符为1时给int数组赋值1
    }  


    int num = 0;  
    for(int k = 1; k <= n; k++)  
        for(int p = 1; p <= m; p++)  
        {  
            if(arr[k][p] == 1)  
            {  
                num++;  
                DFS(k,p);     
            }  
        }  

    cout << num <<endl;  

    return 0;  
}  

2.5小z的三角形

#include<iostream> 
#include<stdio.h> 
#include<string> 
using namespace std;  

int arr[15][15];//+为0 -为1 
int sum;//-号个数 
int num = 0;//满足题意的图形数 
int n;  
int i,j;  

void prin(int n)  
{  
    for(i = 1; i < n; i++)  //由第一行构造整个三角形
    {  
        for(j = 0; j < n-i;j++)  
        {  
            arr[i][j] = arr[i-1][j]+arr[i-1][j+1];  
            arr[i][j]%=2;  
        }   
    }  

    sum = 0;  
    for(i = 0; i < n; i++)  
        for(j = 0; j < n-i;j++)  
            if(arr[i][j]) sum++;   //sum值即-号个数

    if(3*sum == n*(n+1))   //若-号占全部的2/3 输出三角形
    {  
        num++;  
        for(i = 0; i < n; i++)  
        {  
            for(j = 0; j < n-i;j++)  
            {  
                if(arr[i][j]) cout << '-'<<" ";  
                else cout << '+'<<" ";  
            }  
            cout <<endl;  
        }  
    }  
}  

void search(int step)  //深搜枚举第一行的01情况
{  
    if(step >= n) prin(n);  
    else  
    {  
        arr[0][step] = 0; search(step+1);  
        arr[0][step] = 1; search(step+1);  
    }  
}  

int main()  
{  

    cin >> n;  

    search(0);  

    cout << num;   

    return 0;  
}  

你可能感兴趣的:(DFS)