Advertisement
MarioYC

Selectivo 3 - P6

Sep 10th, 2012
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.27 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. struct match{
  8.     int r,c,dir;
  9.    
  10.     match(){}
  11.     match(int _r, int _c, int _dir):
  12.         r(_r), c(_c), dir(_dir){}
  13. };
  14.  
  15. #define MAXN 300
  16. #define MAXW 10
  17.  
  18. int W,N,L[MAXW];
  19. char word[MAXW][MAXN];
  20. char M[MAXN][MAXN + 1];
  21. vector<match> v[MAXW];
  22. int mask[MAXN][MAXN];
  23.  
  24. int dr[] = {-1,-1,-1,0,0,1,1,1};
  25. int dc[] = {-1,0,1,-1,1,-1,0,1};
  26.  
  27. bool find_match(int id){
  28.     bool ret = false;
  29.     int len = L[id];
  30.    
  31.     for(int i = 0;i < N;++i){
  32.         for(int j = 0;j < N;++j){
  33.             for(int k = 0;k < 8;++k){
  34.                 bool ok = true;
  35.                 int r = i,c = j;
  36.                
  37.                 for(int pos = 0;pos < len && ok;++pos,r += dr[k],c += dc[k])
  38.                     if(r < 0 || c < 0 || r >= N || c >= N || M[r][c] != word[id][pos]) ok = false;
  39.                
  40.                 if(ok){
  41.                     ret = true;
  42.                     v[id].push_back(match(i,j,k));
  43.                     r = i; c = j;
  44.                    
  45.                     for(int pos = 0;pos < len;++pos,r += dr[k],c += dc[k])
  46.                         mask[r][c] |= (1 << id);
  47.                 }
  48.             }
  49.         }
  50.     }
  51.    
  52.     return ret;
  53. }
  54.  
  55. bool soll;
  56. int M2[MAXN][MAXN];
  57.  
  58. void search(int id){
  59.     if(id == W){
  60.         soll = true;
  61.         return;
  62.     }
  63.    
  64.     int len = L[id],r,c,k;
  65.    
  66.     for(int i = v[id].size() - 1;i >= 0;--i){
  67.         bool ok = true;
  68.         r = v[id][i].r,c = v[id][i].c,k = v[id][i].dir;
  69.        
  70.         for(int pos = 0;pos < len && ok;++pos,r += dr[k],c += dc[k])
  71.             if(M2[r][c] != -1) ok = false;
  72.        
  73.         if(ok){
  74.             r = v[id][i].r,c = v[id][i].c;
  75.            
  76.             for(int pos = 0;pos < len;++pos,r += dr[k],c += dc[k])
  77.                 M2[r][c] = id;
  78.            
  79.             search(id + 1);
  80.             if(soll) return;
  81.            
  82.             r = v[id][i].r,c = v[id][i].c;
  83.            
  84.             for(int pos = 0;pos < len;++pos,r += dr[k],c += dc[k])
  85.                 M2[r][c] = -1;
  86.         }
  87.     }
  88. }
  89.  
  90. int main(){
  91.     int tc = 1;
  92.     char aux[2];
  93.    
  94.     while(true){
  95.         scanf("%d %d",&W,&N);
  96.         if(W == 0) break;        
  97.        
  98.         for(int i = 0;i < W;++i){
  99.             scanf("%s",word[i]);
  100.             L[i] = strlen(word[i]);
  101.         }
  102.        
  103.         for(int i = 0;i < N;++i){
  104.             for(int j = 0;j < N;++j){
  105.                 scanf("%s",aux);
  106.                 M[i][j] = aux[0];
  107.             }
  108.         }
  109.        
  110.         memset(mask,0,sizeof mask);
  111.         bool found = true;
  112.        
  113.         for(int i = 0;i < W;++i){
  114.             v[i].clear();
  115.             found = found && find_match(i);
  116.         }
  117.        
  118.         printf("Puzzle %d: ",tc++);
  119.            
  120.         soll = false;
  121.        
  122.         if(found){
  123.             memset(M2,-1,sizeof M2);
  124.             search(0);
  125.         }
  126.        
  127.         bool chall = false;
  128.        
  129.         for(int i = 0;i < N;++i)
  130.             for(int j = 0;j < N;++j)
  131.                 if(__builtin_popcount(mask[i][j]) > 1)
  132.                     chall = true;
  133.        
  134.         printf("%s\n%s %s\n",chall && soll? "ACCEPT" : "REJECT",found && chall? "YES" : "NO",soll? "YES" : "NO");
  135.        
  136.     }
  137.    
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement