ブルーブリッジカップ--切手を切る


(このプログラムから学ぶことができる:どのように図の連通成分を計算して、どのようにDFSを通じて図が連通するかどうかを判断して、C++の全配列関数の次のnext_permutationとそのヘッダファイル)
 
【図1.jpg】のように、12枚の干支がつながっている切手があります.
今、中から5枚切ってください.連続していなければなりません.例えば、【図2.jpg】、【図3.jpg】では、ピンク色の部分が合格の切り取りです.
 
 
全部で何種類のカット方法があるか計算してください.シナリオ数を示す整数を記入してください.注意:あなたが提出したのは整数で、余分な内容や説明的な文字を記入しないでください.
構想:配列int b[]={0,0,0,0,0,0,1,1,1}を用いる.12個の位置に対応する全配列を生成
dfsは,問題条件を満たす5つの1つの連通方式があるか否かを判断する.
ここではアクセスした時刻を設定することに注意します(ここでは1つ目)
(1)あるポイントに入ってアクセスする
(2)次の場所が可能と判断してアクセスを設定
1 ACコード
#include
#include
#include
int map[3][4],vis[3][4];
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int row=3,column=4;
int ans=0;
using namespace std;
void dfs(int x,int y)
{
	int nx,ny;
	int i,j;
	vis[x][y]=true;
	for(i=0;i<4;i++)
	{
		nx=x+dir[i][0];
		ny=y+dir[i][1];
		if(nx<0||nx>=row||ny<0||ny>=column) continue;
		if(vis[nx][ny]||!map[nx][ny]) continue;
		dfs(nx,ny);
	}
}
int main()
{
	int b[12]={0,0,0,0,0,0,0,1,1,1,1,1};
	int num,cnt,i,j;
	do
	{
		cnt=0;
		num=0;
		memset(map,0,sizeof(map));
		memset(vis,false,sizeof(vis));
		for(i=0;i