タイトル説明
6x6グリッドをグリッドの端に沿って2つの部分にカットします。2つのパーツの形状は完全に同じである必要があります。この図は、実行可能な除算方法を示しています。
計算してみてください:これらの3つの除算方法を含めて、合計でいくつの異なる除算方法がありますか?注:回転対称性は同じ除算方法に属します。
出力
答えを示す整数を出力します
https://blog.csdn.net/weixin_43914593/article/details/112257103
✬✬✬✬✬分割されたグリッドからDFSを関連付ける方法は?✬✬✬✬✬
ハイライト:
1.回転対称性は同じ除算法に属するため、得られる結果は/ 4です。
2.質問の意味によると、この切断線はグラフの中心点を通過する必要があります。境界に到達する分割線の半分を決定したら、対称性のこの半分に基づいて残りの半分を描画できます。 。(つまり、中心点から検索できます)
3.検索の過程で、検索した分割線の半分は、中心に対して対称な2点を同時に通過できないことに注意してください。したがって、マークを付けるときは、対称点もマークする必要があります。(Vis [x] [y] = true、vis [6-x] [6-y] = true)
4.右、左、上、下、4方向のDFS。
int X [] = {0、-1,1,0,0};
int Y [] = {0,0,0、-1,1};
x + = X [i];
y + = Y [i];
間違い:
1.forループでの再帰
2.一歩踏み出した後、このポイントに行ったことがあるかどうか尋ねてください
for(int i = 1; i <= 4; i ++){// 4方向
x + = X [i]; y + = Y [i]; //一歩踏み出す
if(!vis [x] [y]){//ポイントにアクセスしていない場合は、検索を続行します
vis [x] [y] = true ; //現在のポイントは訪問済みとしてマークされます
vis [6-x] [6-y] = true ;
dfs(x、y); //検索を続行
vis [6-x] [6-y] = false ;
vis [x] [y] = false ;
}
x- = X [i]; y- = Y [i];
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 110000;
int X[]={0,-1,1,0,0};
int Y[]={0,0,0,-1,1};
bool vis[10][10];
int ans=0;
void dfs(int x,int y)
{
if(x==0||x==6||y==0||y==6)
{
ans++;
return ;
}
for(int i=1;i<=4;i++)
{
x+=X[i];
y+=Y[i];
if(!vis[x][y])
{
vis[x][y]=true;
vis[6-x][6-y]=true;
dfs(x,y);
vis[6-x][6-y]=false;
vis[x][y]=false;
}
x-=X[i];
y-=Y[i];
}
}
int main()
{
vis[3][3]=true;
dfs(3,3);
cout<<ans/4;
return 0;
}