蓝桥杯回朔算法之数字矩阵
2016-03-19 23:27
411 查看
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1
输入时是这样,输出有15个(此为答案)
意思是找出此数字矩阵中所有的不同的六位数
此问题是典型的回朔算法
#include<stdio.h>
int a[6][6],c[1000000],ans,cnt,flag;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y,int t){
if(cnt==5){ //判断是否为一个六位数
flag=1;
for(int i=0;i<ans;i++){
if(t==c[i]){
flag=0;
break; //break 跳出的是那层循环
}
}
if(flag)
c[ans++]=t;
return;
}
for(int i=0;i<4;i++){ //上下左右移动
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=0 && tx<5 && ty>=0 &&ty<5){
cnt++; //移位表明位数
dfs(tx,ty,t*10+a[tx][ty]); <span style="white-space:pre"> </span>//加上下一位
cnt--; // 算满六位之后进入if()循环然后cnt--进行回朔就像一个栈一样进行出栈
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1
输入时是这样,输出有15个(此为答案)
意思是找出此数字矩阵中所有的不同的六位数
此问题是典型的回朔算法
#include<stdio.h>
int a[6][6],c[1000000],ans,cnt,flag;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y,int t){
if(cnt==5){ //判断是否为一个六位数
flag=1;
for(int i=0;i<ans;i++){
if(t==c[i]){
flag=0;
break; //break 跳出的是那层循环
}
}
if(flag)
c[ans++]=t;
return;
}
for(int i=0;i<4;i++){ //上下左右移动
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=0 && tx<5 && ty>=0 &&ty<5){
cnt++; //移位表明位数
dfs(tx,ty,t*10+a[tx][ty]); <span style="white-space:pre"> </span>//加上下一位
cnt--; // 算满六位之后进入if()循环然后cnt--进行回朔就像一个栈一样进行出栈
} } } int main(){ for(int i=0;i<5;i++) for(int j=0;j<5;j++) //输入整个数组 scanf("%d",&a[i][j]); cnt=0; //cnt代表了位数 ans=0; //ans代表了有多少个不同解 for(int i=0;i<5;i++) for(int j = 0;j<5;j++) dfs(i,j,a[i][j]); //将每一位 数都深搜一遍 printf("%d\n",ans); return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua和C语言的交互详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法