ブルーブリッジカップカットスタンプ
これは、2016年のブルーブリッジカップC言語地方大会グループBの7番目の質問です。
タイトル:
以下に示すように、12個の干支のスタンプが12個接続されています。今、あなたはそれから5枚のシートを切り取らなければなりません、要件は接続されなければなりません。(コーナーを接続するだけでは接続されているとは見なされません)
たとえば、次の2つの写真では、ピンクで示されている部分が修飾カットです。
さまざまなクリッピング方法がいくつあるかを計算してください。
出力:
プランの数を表す整数を入力してください。
アイデア:
- まず、配列を
1 2 3 4
6 7 8 9
11 12 13 14として格納し
ます。これにより、2つの数値の減算の絶対値が5の場合、それは上下の隣接関係になり、絶対値は1になります。左右の隣接関係。
上の写真を見ると、質問の意味が満たされている場合、各スタンプの接続されたスタンプの数の合計は8以上でなければならず、各スタンプには接続されたスタンプがあることがわかります。(上の2つの写真の接続数の合計は8です。12567をカットすると、接続数は9になります。)このルールに従って、二重ループを使用して回答を検索できます。
- 前の5層のループは、重複を防ぐためにすべての可能性を組み合わせるために使用されました。
ACコード:
#include<bits/stdc++.h>
using namespace std;
int temp[]={
1,2,3,4,6,7,8,9,11,12,13,14};
int shuzu[5];
int ans=0;
/*
1 2 3 4
6 7 8 9
11 12 13 14
*/
bool judge()
{
int count=0;
for(int now=0;now<5;now++)//取前五个 看是否都相连
{
int flag=0;//先假设不相连
for(int now1=0;now1<5;now1++)//挨个判断
{
if(now==now1)
continue;
if(abs(shuzu[now1]-shuzu[now])==5||abs(shuzu[now1]-shuzu[now])==1)//上下相连 绝对值为5 或者 左右相连 绝对值为1
{
flag+=1;//相连点位+1
}
}
if(flag==0)//如果是孤立点 没有相连点位 就直接返回false
{
return false;
}
count+=flag;//加上连接数
}
if(count<8)//如果连接数小于8 则说明5个点位没有相互相邻
{
return false;
}
//printf("%d %d %d %d %d\n",shuzu[0],shuzu[1],shuzu[2],shuzu[3],shuzu[4]);
return true;
}
int main()
{
for(int a=0;a<12;a++)
{
for(int b=a+1;b<12;b++)
{
for(int c=b+1;c<12;c++)
{
for(int d=c+1;d<12;d++)
{
for(int e=d+1;e<12;e++)
{
shuzu[0]=temp[a],shuzu[1]=temp[b],shuzu[2]=temp[c],shuzu[3]=temp[d],shuzu[4]=temp[e];
if(judge())
{
ans++;
}
}
}
}
}
}
cout<<ans;
return 0;
}