国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

第七屆C/C++B-方格填數

2019-11-08 01:48:01
字體:
來源:轉載
供稿:網友
方格填數如下的10個格子   +--+--+--+   |  |  |  |+--+--+--+--+|  |  |  |  |+--+--+--+--+|  |  |  |+--+--+--+(如果顯示有問題,也可以參看【圖1.jpg】)填入0~9的數字。要求:連續的兩個數字不能相鄰。(左右、上下、對角都算相鄰)一共有多少種可能的填數方案?請填寫表示方案數目的整數。

注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

思路:

DFS

優化:

因為搜索的位置是按照很縱坐標依次增大來的,所以原來設定的8個方向就可以縮短為4個方向。

測試結果:1580

代碼:

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cmath>using namespace std;int ans[3][4];bool bns[10];int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};int sum=0;void init(){    memset(ans,-1,sizeof(ans));    memset(bns,false,sizeof(bns));}bool check(int x, int y, int num){    int sx,sy;    for(int i=0;i<=7;i++)    {        sx=x+dir[i][0];        sy=y+dir[i][1];        if(sx<0||sx>2||sy<0||sy>3)//越界跳過            continue;        if(ans[sx][sy]==-1)            continue;        if(fabs(ans[sx][sy]-num)==1)            return false;    }    return true;}void dfs(int x, int y)//位置的橫坐標、縱坐標{    for(int i=0;i<=9;i++)    {        if(!bns[i]&&check(x,y,i))//沒有使用過i,并且檢查可用        {            bns[i]=true;            ans[x][y]=i;            if(x==2&&y==2)            {                sum++;            }            else            {                if(y!=3)                    dfs(x,y+1);                else                {                    dfs(x+1,0);                }            }            bns[i]=false;            ans[x][y]=-1;        }    }}int main(){    init();    dfs(0,1);    PRintf("%d/n",sum);//1580    return 0;}優化之后:

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cmath>using namespace std;int ans[3][4];bool bns[10];int dir[4][2]={{-1,-1},{-1,0},{-1,1},{0,-1}};int sum=0;void init(){    memset(ans,-1,sizeof(ans));    memset(bns,false,sizeof(bns));}bool check(int x, int y, int num){    int sx,sy;    for(int i=0;i<=3;i++)    {        sx=x+dir[i][0];        sy=y+dir[i][1];        if(sx<0||sx>2||sy<0||sy>3)//越界跳過            continue;        if(ans[sx][sy]==-1)            continue;        if(fabs(ans[sx][sy]-num)==1)            return false;    }    return true;}void dfs(int x, int y)//位置的橫坐標、縱坐標{    for(int i=0;i<=9;i++)    {        if(!bns[i]&&check(x,y,i))//沒有使用過i,并且檢查可用        {            bns[i]=true;            ans[x][y]=i;            if(x==2&&y==2)            {                sum++;            }            else            {                if(y!=3)                    dfs(x,y+1);                else                {                    dfs(x+1,0);                }            }            bns[i]=false;            ans[x][y]=-1;//優化之后這里就不用恢復現場也可以        }    }}int main(){    init();    dfs(0,1);    printf("%d/n",sum);//1580    return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 池州市| 习水县| 甘泉县| 临汾市| 庄河市| 黑山县| 昌图县| 盐边县| 任丘市| 明溪县| 郸城县| 措美县| 昌宁县| 延长县| 扬中市| 金山区| 永安市| 巫山县| 长岛县| 芷江| 渑池县| 神池县| 白水县| 青州市| 天台县| 巴塘县| 兰坪| 宁武县| 平定县| 金坛市| 明光市| 武平县| 大安市| 沁水县| 黄平县| 阜阳市| 灌南县| 梁山县| 乐昌市| 江陵县| 宁明县|