国产探花免费观看_亚洲丰满少妇自慰呻吟_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;}


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

圖片精選

主站蜘蛛池模板: 兴山县| 修水县| 玉田县| 嘉义市| 临澧县| 哈密市| 建德市| 方正县| 沭阳县| 重庆市| 无为县| 凤山市| 措美县| 咸阳市| 辽宁省| 银川市| 沂水县| 慈利县| 深州市| 荔波县| 安泽县| 南华县| 万盛区| 卢湾区| 桃江县| 宝山区| 突泉县| 商河县| 沧源| 邹城市| 富平县| 正镶白旗| 抚宁县| 阿克陶县| 建瓯市| 海丰县| 鄂伦春自治旗| 南安市| 淮滨县| 苍南县| 呼伦贝尔市|