上午终于考完最后一科了
接下来就要开始刷题了
前几天先快速的把之前基础的东西再巩固一下,一两个月没碰很多东西又忘了
而且,很多东西回顾起来,理解的也更深一些
【回溯】
【搜索】
n皇后问题
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 6 int vis[3][100]; 7 int n,tot; 8 void dfs(int cur) 9 { 10 if(cur==n) tot++; 11 else for(int i=0;i<n;i++) if(!vis[0][i]&& !vis[1][i+cur]&& !vis[2][i-cur+n]) 12 { 13 vis[0][i]=vis[1][i+cur]=vis[2][i-cur+n]=1; 14 dfs(cur+1); 15 vis[0][i]=vis[1][i+cur]=vis[2][i-cur+n]=0; 16 } 17 18 } 19 int main() 20 { 21 while(scanf("%d",&n)&&n) 22 { 23 memset(vis,0,sizeof(vis)); 24 tot=0; 25 dfs(0); 26 printf("%d ",tot); 27 } 28 }
素数环UVA - 524
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 const int maxn=100; 6 7 int a[20]; 8 int pri[maxn]; 9 int n; 10 int vis[20]; 11 void init() 12 { 13 memset(pri,0,sizeof(pri)); 14 for(int i=2;i*i<maxn;i++) if(!pri[i]) 15 { 16 for(int j=i*i;j<maxn;j+=i) pri[j]=1; 17 } 18 } 19 void dfs(int cur) 20 { 21 if(cur==n&&!pri[a[n-1]+a[0]]){ 22 for(int i=0;i<n-1;i++) printf("%d ",a[i]); 23 printf("%d ",a[n-1]); 24 } 25 else for(int i=1;i<=n;i++){ 26 if(!vis[i]&&!pri[i+a[cur-1]]) a[cur]=i; 27 else continue; 28 vis[i]=1; 29 dfs(cur+1); 30 vis[i]=0; 31 } 32 } 33 int main() 34 { 35 int t=0; 36 int kase=1; 37 init(); 38 a[0]=1; //设定首位为1,否则会循环输出 39 vis[1]=1; 40 while(scanf("%d",&n)!=EOF) 41 { 42 if(t) puts(""); 43 else t=1; 44 printf("Case %d: ",kase++); 45 dfs(1); //从第二位开始 46 } 47 }
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 const int MAXN = 80; 6 7 int n, l, count; 8 char v[MAXN+1]; 9 10 // 判定是否有相邻的重复子串:只需要考虑追加1个字符后是否产生相邻重复子串 11 bool check(int curr) 12 { 13 for(int i=1; i<=(curr + 1) / 2; i++) { 14 bool equal = true; 15 for(int j=0; j<i; j++) 16 if(v[curr - i - j] != v[curr - j]) { 17 equal = false; 18 break; 19 } 20 if(equal) 21 return false; 22 } 23 24 return true; 25 } 26 27 void output_result(int curr) 28 { 29 for(int i=0; i<=curr; i++) { 30 if(i % 4 == 0 && i > 0) { 31 if(i % 64 == 0 && i > 0) 32 puts(""); 33 else 34 putchar(' '); 35 } 36 putchar(v[i]); 37 } 38 printf(" %d ", curr+1); 39 } 40 41 // 对于第curr字符,从‘A’到第l个字母都试探一遍 42 int dfs(int curr) 43 { 44 for(int i=0; i<l; i++) { 45 v[curr] = 'A' + i; 46 if(check(curr)) { 47 if(++count == n) { 48 v[curr + 1] = '