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

来源:互联网 发布:大学o2o源码 编辑:程序博客网 时间:2024/05/16 16:34

这里写图片描述

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;  }  
0 0