方格填数
来源:互联网 发布:科勒有几家网络授权店 编辑:程序博客网 时间:2024/04/30 15:35
/*1160: 方格填数
时间限制: 1 Sec 内存限制: 128 MB
提交: 3 解决: 2
[提交][状态][讨论版]
题目描述
如上面的10个格子,填入0~9的数字,不能重复(原先已经填了一部分数字),要求:连续的两个数字不能相邻(左右,上下,对角都算相邻)。例如:数字0和1不能放在一起。
问:一共有多少种可能的填数方案?
输入
输入多组测试数据。
每组测试数据有三行,第一行三个整数,第二行四个整数,第三行三个整数,之间用空格隔开,分别代表每个空格所填的数,如果原先没有数,则填-1。
输入数据保证不重复数字,不保证连续数字不相邻。
输出
每组测试数据输出一行。
输出表示方案数目的整数。
样例输入
-1 -1 -1
-1 -1 -1 -1
-1 -1 -1
0 1 -1
-1 -1 -1 -1
-1 -1 -1
1 3 5
-1 -1 -1 -1
-1 -1 -1
样例输出
1580
0
8*/
#include<stdio.h>
#include<string.h>
#include<math.h>
int a[3][4]={-2},b[10];
int count;
int judge(int x,int y,int m)
{
if(x>0&&(a[x-1][y]==m+1||a[x-1][y]==m-1))
return 0;
if(y>0&&(a[x][y-1]==m+1||a[x][y-1]==m-1))
return 0;
if(x>0&&y>0&&(a[x-1][y-1]==m+1||a[x-1][y-1]==m-1))
return 0;
if(x>0&&y<3&&(a[x-1][y+1]==m+1||a[x-1][y+1]==m-1))
return 0;
return 1;
}
void dfs(int n)
{
int i;
int r=n/4;
int c=n%4;
if(n==11)
{
count++;
return ;
}
if(a[r][c]==-1)
{
for(i=0;i<=9;i++)
{
if(!b[i]&&judge(r,c,i))
{
a[r][c]=i;
b[i]=1;
dfs(n+1);
a[r][c]=-1;
b[i]=0;
}
}
}
else
{
if(judge(r,c,a[r][c]))//判断与输入的数之间有没有相邻的
dfs(n+1);
}
}
int main()
{
while(~scanf("%d",&a[0][1]))
{
memset(b,0,sizeof(b));
int i;
if(a[0][1]!=-1)
b[a[0][1]]=1;
for(i=2;i<4;i++)
{
scanf("%d",&a[0][i]);
if(a[0][i]!=-1)
b[a[0][i]]=1;
}
for(i=0;i<4;i++)
{
scanf("%d",&a[1][i]);
if(a[1][i]!=-1)
b[a[1][i]]=1;
}
for(i=0;i<3;i++)
{
scanf("%d",&a[2][i]);
if(a[2][i]!=-1)
b[a[2][i]]=1;
}
count=0;
dfs(1);
printf("%d\n",count);
}
return 0;
}
时间限制: 1 Sec 内存限制: 128 MB
提交: 3 解决: 2
[提交][状态][讨论版]
题目描述
如上面的10个格子,填入0~9的数字,不能重复(原先已经填了一部分数字),要求:连续的两个数字不能相邻(左右,上下,对角都算相邻)。例如:数字0和1不能放在一起。
问:一共有多少种可能的填数方案?
输入
输入多组测试数据。
每组测试数据有三行,第一行三个整数,第二行四个整数,第三行三个整数,之间用空格隔开,分别代表每个空格所填的数,如果原先没有数,则填-1。
输入数据保证不重复数字,不保证连续数字不相邻。
输出
每组测试数据输出一行。
输出表示方案数目的整数。
样例输入
-1 -1 -1
-1 -1 -1 -1
-1 -1 -1
0 1 -1
-1 -1 -1 -1
-1 -1 -1
1 3 5
-1 -1 -1 -1
-1 -1 -1
样例输出
1580
0
8*/
#include<stdio.h>
#include<string.h>
#include<math.h>
int a[3][4]={-2},b[10];
int count;
int judge(int x,int y,int m)
{
if(x>0&&(a[x-1][y]==m+1||a[x-1][y]==m-1))
return 0;
if(y>0&&(a[x][y-1]==m+1||a[x][y-1]==m-1))
return 0;
if(x>0&&y>0&&(a[x-1][y-1]==m+1||a[x-1][y-1]==m-1))
return 0;
if(x>0&&y<3&&(a[x-1][y+1]==m+1||a[x-1][y+1]==m-1))
return 0;
return 1;
}
void dfs(int n)
{
int i;
int r=n/4;
int c=n%4;
if(n==11)
{
count++;
return ;
}
if(a[r][c]==-1)
{
for(i=0;i<=9;i++)
{
if(!b[i]&&judge(r,c,i))
{
a[r][c]=i;
b[i]=1;
dfs(n+1);
a[r][c]=-1;
b[i]=0;
}
}
}
else
{
if(judge(r,c,a[r][c]))//判断与输入的数之间有没有相邻的
dfs(n+1);
}
}
int main()
{
while(~scanf("%d",&a[0][1]))
{
memset(b,0,sizeof(b));
int i;
if(a[0][1]!=-1)
b[a[0][1]]=1;
for(i=2;i<4;i++)
{
scanf("%d",&a[0][i]);
if(a[0][i]!=-1)
b[a[0][i]]=1;
}
for(i=0;i<4;i++)
{
scanf("%d",&a[1][i]);
if(a[1][i]!=-1)
b[a[1][i]]=1;
}
for(i=0;i<3;i++)
{
scanf("%d",&a[2][i]);
if(a[2][i]!=-1)
b[a[2][i]]=1;
}
count=0;
dfs(1);
printf("%d\n",count);
}
return 0;
}
1 0
- 方格填数
- 蓝桥杯 方格填数
- 蓝桥杯 方格填数
- 方格填数
- 方格填数
- 方格填数
- 方格填数
- 方格填数
- 蓝桥杯方格填数
- 方格填数
- 方格填数
- 6、方格填数
- 蓝桥杯方格填数
- 方格填数
- 方格填数
- 方格填数
- 方格填数
- 方格填数
- spring构造器配置
- Linux网络命令--ping和ifconfig命令
- hihocoder 1049 : 后序遍历
- 258 Add Digits
- android 使用DrawerLayout实现滑动抽屉
- 方格填数
- 安卓集训营第六天---JAVA的集合
- Android:LinearLayout布局中Layout_weight的深刻理解
- Effective C++ Item 02-尽量以const、enum、inline替换#define
- 前端代码异常日志收集与监控
- 从键盘输入某个十进制整数数,转换成对应的二进制整数并输出。
- 【bzoj 3832】 [Poi2014] Rally (权值线段树+拓扑排序)
- Android 中创建Java项目的Date的转换工具
- 77.A problem is easy