zoukankan      html  css  js  c++  java
  • UVa 141 The Spot Game

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=111&page=show_problem&problem=77

    题意:判断摆放过程中是否出现已经出现过的图案,图案可以顺时针旋转90°,180°和水平翻转。

    分析:字符串哈希判重

      1 #include <cstdio>
      2 #include <cstring>
      3 
      4 const int MAXN = 100007;
      5 
      6 char map[52][52];
      7 char temp[52][52];
      8 char temp2[52][52];
      9 bool vis[MAXN];
     10 int N;
     11 
     12 //void show( char (*str)[52] )
     13 //{
     14 //    for ( int i = 0; i < N; ++i )
     15 //    {
     16 //        for ( int j = 0; j < N; ++j )
     17 //        putchar(str[i][j]);
     18 //        puts("");
     19 //    }
     20 //}
     21 
     22 unsigned int BKDRHash( char (*str)[52] )
     23 {
     24     unsigned int seed = 31;
     25     unsigned int hash = 0;
     26 
     27     for ( int i = 0; i < N; ++i )
     28       for ( int j = 0; j < N; ++j )
     29          hash = hash * seed + str[i][j];
     30 
     31     return (hash & 0x7FFFFFFF) % MAXN;
     32 }
     33 
     34 void Rotate( char (*str)[52], char (*ttemp)[52] )
     35 {
     36     for ( int i = 0; i < N; ++i )
     37       for ( int j = 0; j < N; ++j )
     38          ttemp[ j ][ N - 1 - i ] = str[i][j];
     39    // show(str);
     40    // show(ttemp);
     41    // puts("-------------");
     42     int hash = BKDRHash( ttemp );
     43    // printf("%d\n", hash);
     44     vis[hash] = true;
     45     return;
     46 }
     47 
     48 void Reflact( char (*str)[52] )
     49 {
     50     for ( int i = 0; i < N; ++i )
     51       for ( int j = 0; j < N; ++j )
     52          temp[i][N - 1 - j] = str[i][j];
     53 
     54     int hash = BKDRHash( temp );
     55     vis[hash] = true;
     56     return;
     57 }
     58 
     59 int main()
     60 {
     61     int x, y;
     62     char ch[3];
     63     int where, who;
     64     while ( scanf( "%d", &N ), N )
     65     {
     66         bool flag = false;
     67         memset( vis, false, sizeof(vis) );
     68         memset( map, '.', sizeof(map) );
     69 
     70         for ( int i = 0; i < N * 2; ++i )
     71         {
     72             scanf("%d%d%s", &x, &y, ch);
     73             if ( !flag )
     74             {
     75                 switch( ch[0] )
     76                 {
     77                 case '+':
     78                     map[x - 1][y - 1] = '#';
     79                     break;
     80 
     81                 case '-':
     82                     map[x - 1][y - 1] = '.';
     83                     break;
     84                 }
     85                 int hash = BKDRHash( map );
     86      //           printf("%d\n", hash);
     87                 if ( vis[hash] )
     88                 {
     89                     flag = true;
     90                     where = i + 1;
     91                     if ( i % 2 ) who = 1;
     92                     else who = 2;
     93                 }
     94                 vis[hash] = true;
     95                 Rotate( map, temp );
     96                 Rotate( temp, temp2 );
     97                 Reflact( map );
     98             }
     99         }
    100         if ( !flag ) puts("Draw");
    101         else printf( "Player %d wins on move %d\n", who, where );
    102     }
    103     return 0;
    104 }
  • 相关阅读:
    (PHP)redis Zset(有序集合 sorted set)操作
    (PHP)redis Set(集合)操作
    (PHP)redis Hash(哈希)操作
    (PHP)redis String(字符串)操作
    (PHP)redis List(列表)操作
    PHP连接 redis
    PHP json 对象 数组互相转换
    循环节长度 蓝桥杯
    三羊献瑞 蓝桥杯
    立方变自身
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/2737753.html
Copyright © 2011-2022 走看看