ZOJ 1984 DFS
View Code
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 #include<string.h> 5 6 char a[5002],b[4]="NOP"; 7 8 int ok(int l) 9 { 10 int i, j; 11 for(i = 0; i < (l+1)/2; i++) 12 { 13 for(j = 0; j <= i; j++) 14 { 15 if(a[l-i+j] != a[l-2*i+j-1]) 16 break; 17 } 18 if(j > i) return 0; 19 } 20 21 return 1; 22 } 23 24 int DFS(int k) 25 { 26 int i; 27 if(k >= 5000) return 1; 28 for(i=0; i<3; i++) 29 { 30 a[k] = b[i]; 31 if(!ok(k)) continue; 32 if(DFS(k+1)) return 1; 33 } 34 35 return 0; 36 } 37 38 int main() 39 { 40 int i, n; 41 42 DFS(0); 43 while(scanf("%d",&n) && n) 44 { 45 for(i = 0; i < n; i++) 46 printf("%c",a[i]); 47 48 printf("\n"); 49 } 50 51 return 0; 52 } 53 54
每个位置有三种可能。。
伪代码:
bool f(判断第i个位置){
if(i==n){ 输出串;return true; }
d[4]=“NOP”;
for(int k=0;k<3;k++){
if(d[k]加入后符合要求){
第i位置记录d[k];
if (f(判断第(i+1)个位置)) return true;
}
}
return false;
}