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

蓝桥杯回朔算法之数字矩阵

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--进行回朔就像一个栈一样进行出栈
}
}
}
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语言