藍橋杯-搜索暴力

1驾锰、六角填數

運用stl 中的函數next_permutation(a,a+n)
題意:
7:六角填數
如圖【1.png】所示六角形中猿妈,填入1~12的數字屿脐。

使得每條直線上的數字之和都相同兆解。
圖中,已經替你填好了3個數字烫沙,請你計算星號位置所代表的數字是多少搬素?

請通過瀏覽器提交答案绷耍,不要填寫多余的內容祈匙。

答案 10

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};
bool fun()
{
    if(a[0]+a[2]+a[5]+a[6]==26)
    {
            if(a[6]+a[7]+a[8]+a[10]==26)
    {
            if(a[0]+a[3]+a[9]+a[10]==26)
    {
            if(a[1]+a[2]+a[3]+a[4]==26)
    {
            if(a[1]+a[5]+a[7]+a[11]==26)
    {
            if(a[4]+a[9]+a[8]+a[11]==26)
    {
        return true;
    }
    }
    }
    }
    }
    }
    return false;
}
int  main()
{
//  a[12]={1,2,3,4,5,6,7,8,9,10,11,12};
    do{
        if(a[0]==1&&a[1]==8&&a[11]==3)
        {
            if(fun())
            {
                cout<<a[5]<<endl;
                break;
            }
        }
    }while(next_permutation(a,a+12));
return 0;
}

2忽刽、方格填數

運用全排列,不過要注意條件不要寫錯了夺欲。
答案 1580

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int a[10]={0,1,2,3,4,5,6,7,8,9};
bool fun()
{
    if(abs(a[0]-a[1])==1||abs(a[0]-a[4])==1||abs(a[0]-a[5])==1||abs(a[0]-a[3])==1)
        return false;
    if(abs(a[4]-a[1])==1||abs(a[1]-a[5])==1||abs(a[1]-a[2])==1||abs(a[1]-a[6])==1)
    return false;
    if(abs(a[2]-a[6])==1||abs(a[2]-a[5])==1)
        return false;
    if(abs(a[3]-a[7])==1||abs(a[3]-a[4])==1||abs(a[3]-a[8])==1)
        return false;
    if(abs(a[4]-a[7])==1||abs(a[4]-a[8])==1||abs(a[4]-a[9])==1||abs(a[4]-a[5])==1)
        return false;
    if(abs(a[5]-a[8])==1||abs(a[5]-a[9])==1||abs(a[6]-a[5])==1)
        return false;
    if(abs(a[6]-a[9])==1)
        return false;
    if(abs(a[7]-a[8])==1||abs(a[8]-a[9])==1)
        return false;
        return true;
}
int  main()
{
    int ans=0;
//  a[12]={1,2,3,4,5,6,7,8,9,10};
    do{
        if(fun())
        {
            ans++;
         } 
    }while(next_permutation(a,a+10));
    cout<<ans;
return 0;
}

3跪帝、減郵票

正確答案是116
給一個錯誤的解法吧

錯誤答案為:222
錯誤原因,排列出C 12 5 的組合后些阅,判斷相連出了問題伞剑,錯誤的判斷是,只要每一個有一個相連即可市埋,其實并不是黎泣,全部都有相連 可能存在兩個連通塊。啦啦啦缤谎,紙上覺來終覺淺覺聘裁,絕知此事要躬行。老師講的就是這種方法弓千,我不敲一下,真的以為是對的献起。放個錯解洋访,以示教訓吧。解是錯的谴餐,但是運用組合數來找解的思路還是棒棒噠姻政,一下把解的范圍縮小了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct node{
    int x;
    int y;
}; 
int i,j,k,m,l;
node num[13];
bool fun()
{
    if((abs(num[i].x-num[j].x)+abs(num[i].y-num[j].y))==1||(abs(num[i].x-num[k].x)+abs(num[i].y-num[k].y))==1||(abs(num[i].x-num[m].x)+abs(num[i].y-num[m].y))==1||(abs(num[i].x-num[l].x)+abs(num[i].y-num[l].y))==1)
    {
            if((abs(num[i].x-num[j].x)+abs(num[i].y-num[j].y))==1||(abs(num[j].x-num[k].x)+abs(num[j].y-num[k].y))==1||(abs(num[j].x-num[m].x)+abs(num[j].y-num[m].y))==1||(abs(num[j].x-num[l].x)+abs(num[j].y-num[l].y))==1)
    {
            if((abs(num[m].x-num[j].x)+abs(num[m].y-num[j].y))==1||(abs(num[m].x-num[k].x)+abs(num[m].y-num[k].y))==1||(abs(num[i].x-num[m].x)+abs(num[i].y-num[m].y))==1||(abs(num[m].x-num[l].x)+abs(num[m].y-num[l].y))==1)
    {
            if((abs(num[k].x-num[j].x)+abs(num[k].y-num[j].y))==1||(abs(num[i].x-num[k].x)+abs(num[i].y-num[k].y))==1||(abs(num[k].x-num[m].x)+abs(num[k].y-num[m].y))==1||(abs(num[k].x-num[l].x)+abs(num[k].y-num[l].y))==1)
    {
                if((abs(num[l].x-num[j].x)+abs(num[l].y-num[j].y))==1||(abs(num[i].x-num[l].x)+abs(num[i].y-num[l].y))==1||(abs(num[l].x-num[m].x)+abs(num[l].y-num[m].y))==1||(abs(num[k].x-num[l].x)+abs(num[k].y-num[l].y))==1)
    {
        cout<<i<<" "<<j<<" "<<m<<" "<<k<<" "<<l<<endl;
        return true;
    }
    }
    }
    }
    }
    return false;
}
int  main()
{
num[1].x=1;
num[1].y=1;
num[2].x=1;
num[2].y=2;
num[3].y=3;
num[3].x=1;
num[4].y=4;
num[4].x=1;
num[5].y=1;
num[5].x=2;
num[6].y=2;
num[6].x=2;
num[7].y=3;
num[7].x=2;
num[8].y=4;
num[8].x=2;
num[9].y=1;
num[9].x=3;
num[10].y=2;
num[10].x=3;
num[11].y=3;
num[11].x=3;
num[12].y=4;
num[12].x=3;
int ans=0;
for(i=1;i<9;i++)
{
    for(j=i+1;j<10;j++)
    {
        for(m=j+1;m<11;m++)
        {
            for(k=m+1;k<12;k++)
            {
                for(l=k+1;l<13;l++)
                {
                    if(fun())
                    {
                        ans++;
                    }
                }
            }
        }
     } 
}
cout<<ans;
return 0;
}

再分享一個錯解吧:哈哈岂嗓,又搞錯了
3x4的矩陣中一筆畫完的 5個連續(xù)的圖案一共有多少種

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std; 
int i,j;
int mapp[3][4];
int ans=0;
void dfs(int a,int b,int n)// x,y,幾步 
{
    if(n==5)
    {
        ans++;
    }
    if(a+1<3)
    {
        dfs(a+1,b,n+1);
    }
    if(b+1<4)
    {
        dfs(a,b+1,n+1);
    }
}
int  main()
{
for(i=0;i<3;i++)
{
    for(j=0;j<4;j++)
    {
        dfs(i,j,1);
    } 
}
cout<<ans;
return 0;
}

正解:運用深搜汁展,判斷連通塊
終于正確了,參考了別人的方法厌殉,為了避免 一行的最后一個和下一行的第一個在搜索的時候判斷連續(xù)食绿,把圖做了一下處理
【1,2公罕,3器紧,4 ,5楼眷,6铲汪,7熊尉,8, 9掌腰, 10狰住,11,12】
【1齿梁,2催植,3,4士飒, 6查邢,7,8酵幕,9扰藕, 11,12芳撒,13邓深,14】
用 -5 +5 表示上下 -1 +1 表示左右,比用0 1 矩陣存儲彼此的相鄰關系簡單許多
博客地址
http://blog.csdn.net/u014552756/article/details/50946197

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int ans=0;
int a[5];
int visited[5];
int num[12]={1,2,3,4,6,7,8,9,11,12,13,14};
int d[4]={-1,1,5,-5}; 
int i,j,k,l,m; 
void dfs(int n)//判斷這五個數是不是一個連通塊 
{
    for(int i=0;i<4;i++)// 
    {
        int t=a[n]+d[i];
        if(t>14||t<1||t==5||t==10)
        continue;
        for(int j=0;j<5;j++)
        {
            if(visited[j]!=1&&a[j]==t)
            {
                visited[j]=1;
                dfs(j);
            }
        }
    }
}
int  main()
{
for(i=0;i<8;i++)
{
    for(j=i+1;j<9;j++)
    {
        for(k=j+1;k<10;k++)
        {
            for(l=k+1;l<11;l++)
            {
                for(m=l+1;m<12;m++)
                {
                    a[0]=num[i];
                    a[1]=num[j];
                    a[2]=num[k];
                    a[3]=num[l];
                    a[4]=num[m];
                    memset(visited,0,sizeof(visited));
                    visited[0]=1;
                    dfs(0);
                    int f=1;
                    for(int i=0;i<5;i++)
                    {
                        if(visited[i]==0)
                        {
                            f=0;
                        }
                        
                    }
                    if(f)
                    ans++;
                }
            }
        }
     } 
}
cout<<ans;
return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末笔刹,一起剝皮案震驚了整個濱河市芥备,隨后出現的幾起案子,更是在濱河造成了極大的恐慌舌菜,老刑警劉巖萌壳,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異日月,居然都是意外死亡袱瓮,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門爱咬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尺借,“玉大人,你說我怎么就攤上這事精拟×钦叮” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵蜂绎,是天一觀的道長栅表。 經常有香客問我,道長师枣,這世上最難降的妖魔是什么谨读? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮坛吁,結果婚禮上劳殖,老公的妹妹穿的比我還像新娘铐尚。我一直安慰自己,他們只是感情好哆姻,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布宣增。 她就那樣靜靜地躺著,像睡著了一般矛缨。 火紅的嫁衣襯著肌膚如雪爹脾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天箕昭,我揣著相機與錄音灵妨,去河邊找鬼。 笑死落竹,一個胖子當著我的面吹牛泌霍,可吹牛的內容都是我干的。 我是一名探鬼主播述召,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼朱转,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了积暖?” 一聲冷哼從身側響起藤为,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夺刑,沒想到半個月后缅疟,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡遍愿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年存淫,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片错览。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖煌往,靈堂內的尸體忽然破棺而出倾哺,到底是詐尸還是另有隱情,我是刑警寧澤刽脖,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布羞海,位于F島的核電站,受9級特大地震影響曲管,放射性物質發(fā)生泄漏却邓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一院水、第九天 我趴在偏房一處隱蔽的房頂上張望腊徙。 院中可真熱鬧简十,春花似錦、人聲如沸撬腾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽民傻。三九已至胰默,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漓踢,已是汗流浹背牵署。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喧半,地道東北人奴迅。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像薯酝,于是被迫代替她去往敵國和親半沽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內容