ブルーブリッジカップデイリーワン質問1.62017州大会グループA4。グリッド部門[DFS]

タイトル説明

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.一歩踏み出した後、このポイントに行ったことがあるかどうか尋ねてください

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


 

おすすめ

転載: blog.csdn.net/qq_43660826/article/details/112982567