您的位置:首页 > 其它

第15届浙江省赛题 (dfs)

2015-06-01 18:33 183 查看
题意是给你个数(1-9)  表示密码里的数,用这几个数能组成多少个合法的密码并输出;

不和法的有132    及1连3 时经过了2   但是2有没有被走过 所以是不存在的    排除这种情况就行了 

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;

int n,mark[10],map[10],num[10];
int leap[11][11];
int sum;
int judge(int a,int b)
{
int x=leap[a][b];
if(x==0) return 0;
if(mark[x]==0) return 1;
return 0;
}
int ans[150000][11];
int dfs(int t)
{
if(t==n+1)
{
sum++;
for(int i=1;i<=n;i++)
ans[sum][i]=num[i];
//printf("%d\n",sum);
return 0;
}
int i;
for(i=1;i<=9;i++)
{
if(map[i]==1&&mark[i]==0)
{
int flash=0;
flash=judge(num[t-1],i);
//printf("%d %d %d\n",num[t-1],i,flash);
if(!flash)
{
mark[i]=1;
num[t]=i;
dfs(t+1);
num[t]=0;
mark[i]=0;
}
}
}
return 0;
}
int main()
{
int T,i,j;
scanf("%d",&T);
memset(leap,0,sizeof(leap));
leap[1][3]=leap[3][1]=2;
leap[1][7]=leap[7][1]=4;
leap[1][9]=leap[9][1]=5;
leap[2][8]=leap[8][2]=5;
leap[3][7]=leap[7][3]=5;
leap[3][9]=leap[9][3]=6;
leap[4][6]=leap[6][4]=5;
leap[7][9]=leap[9][7]=8;
while(T--)
{
scanf("%d",&n);
memset(mark,0,sizeof(mark));
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
map[a]=1;
}
sum=0;
dfs(1);
printf("%d\n",sum);
for(i=1;i<=sum;i++)
{
for(j=1;j<=n;j++)
{
if(j!=1) printf(" ");
printf("%d",ans[i][j]);
}
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索