码迷,mamicode.com
首页 > 其他好文 > 详细

第15届浙江省赛题 (dfs)

时间:2015-06-01 18:47:41      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:搜索

题意是给你个数(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;
}

第15届浙江省赛题 (dfs)

标签:搜索

原文地址:http://blog.csdn.net/zxf654073270/article/details/46314829

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!