您的位置:首页 > 新闻 > 热点要闻 > 黄页88网站_保定免费做网站_兔子bt搜索_草莓永久地域网名入2022

黄页88网站_保定免费做网站_兔子bt搜索_草莓永久地域网名入2022

2024/12/25 9:13:28 来源:https://blog.csdn.net/2401_84379088/article/details/144620185  浏览:    关键词:黄页88网站_保定免费做网站_兔子bt搜索_草莓永久地域网名入2022
黄页88网站_保定免费做网站_兔子bt搜索_草莓永久地域网名入2022

【问题描述】

     6*6的方格,沿着格子的边线剪开成两部分,要求这两部分的形状完全相同。如下图所示,p1.png、p2.png、p3.png就是可行的分割法。

     试计算:包括这三种分法在内,一共有多少种不同的分割方法。

 注意:旋转对称的图形属于同一种分割方法。

【参考答案】

  509

【解析】

       这是一道典型的深度优先搜索题目。但应从何处开始搜索呢?通过观察样例图案可以发现,如果把样例图案剪开,则会有且只有两个点在边界上,且一定经过中心点(3,3)。如果以中心点(3,3)为起点进行深搜,每搜索一个点,根据对称关系,再标记其对称点,该题就可以得到解决了。

       具体的注意点有以下三个。

     (1)最后搜索结果

         根据题意,由于旋转对称的图形属于同一种分割方法,因此最后要将得到的结果除以4,以解决四个顶点的对称性。

       (2)标记对称点

         当搜索一个点时,必须要有一个对称点不能被搜索,即形状的另一个部分。如果搜索点的坐标是(x,y),则根据中心对称,对称点的坐标是(6-x,6-y)。

      (3)搜索方向

       可以向四个方向进行搜索:向右、向左、向上、向下,这里采用方向数组 dx和dy表示。

      int dx[4] = {-1,1,0,0};    int dy[4] = {0,0,-1,1}

【参考程序如下】

#include <iostream>
using namespace std;
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
const int N = 6;
bool visited[N + 1] [N + 1];
int ans = 0;
void dfs(int x,int y)
{if(x == 0 || x == N || y == 0 || y == N){ans++;return;}for(int i = 0; i < 4; i++){int nx = x + dx[i];int ny = y + dy[i];if(!visited[nx][ny]){visited[nx][ny] = true;visited[N - nx] [N - ny] = true;dfs(nx,ny);visited[N - nx] [N - ny] = false;visited[nx][ny] = false;}}
}
int main(int argc, char** argv) {visited[N / 2] [N / 2] = true;dfs(N / 2,N / 2);cout << ans / 4;return 0;
}

【程序运行结果如下】

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com