您的位置:首页 > 编程语言 > C语言/C++

蓝桥杯b组c++.6

2016-04-05 14:45 323 查看
方格填数

如下的10个格子

+–+–+–+

| | | |

+–+–+–+–+

| | | | |

+–+–+–+–+

| | | |

+–+–+–+

(如果显示有问题,也可以参看【图1.jpg】)

填入0~9的数字。要求:连续的两个数字不能相邻。

(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字


这个图片好像不能显示,描述一下吧:就是一个3*4的方格把第一个和最后一个去掉后剩下的部分。

解:

这是一个0~9十个数字填到十个区域去,还是老方法dfs把不同的数字放到不同的方格里,再判断是否符合相邻的数是否对角还是,,。答案是:1580

代码如下:

#include<iostream>
#include<cmath>
using namespace std;
int ans=0;
bool visit[10];
int mpt[3][4];
int  flag[3][4];
void  init()
{
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
flag[i][j]=1;
flag[0][0]=0;
flag[2][3]=0;
}
void solve()
{
int a[8][2]={0,1,0,-1,1,0,-1,0,1,-1,1,1,-1,1,-1,-1};
int book=true;
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
int x,y;
if(flag[i][j]==0)continue;
for(int k=0;k<8;k++)
{
x=i+a[k][0];
y=j+a[k][1];
if(x<0||x>2||y<0||y>3||flag[x][y]==0)continue;
if(fabs(mpt[x][y]-mpt[i][j])==1){book=false;break;}
}
if(flag==0)break;
}
}
if(book)ans++;

}
void dfs(int index)
{
int x=index/4;
int y=index%4;
if(x==3)
{
solve();
return ;
}
if(flag[x][y])
{
for(int i=0;i<10;i++)
{
if(!visit[i])
{
visit[i]=true;
mpt[x][y]=i;
dfs(index+1);
visit[i]=false;
}
}
}
else dfs(index+1);
}
int main()
{
init();
dfs(0);
cout<<ans<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: