第15届浙江省赛题 (dfs)
2015-06-01 18:33
183 查看
题意是给你个数(1-9) 表示密码里的数,用这几个数能组成多少个合法的密码并输出;
不和法的有132 及1连3 时经过了2 但是2有没有被走过 所以是不存在的 排除这种情况就行了
不和法的有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; }
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- C++深度优先搜索的实现方法
- 基于文本的搜索
- 使用Sphinx对索引进行搜索
- asp 多关键词搜索的简单实现方法
- C#使用foreach语句搜索数组元素的方法
- JavaScript中数组的排序、乱序和搜索实现代码
- C#编程实现Excel文档中搜索文本内容的方法及思路
- sqlserver中在指定数据库的所有表的所有列中搜索给定的值
- 可以用来搜索当前页面内容的js代码
- 全文搜索和替换
- javascript搜索自动提示功能的实现第1/3页
- mysql 模糊搜索的方法介绍
- 基于ASP.NET的lucene.net全文搜索实现步骤
- 做个自己站内搜索引擎
- JavaScript搜索字符串并将搜索结果返回到字符串的方法
- php利用scws实现mysql全文搜索功能的方法
- 两个listbox实现选项的添加删除和搜索