141 The Spot Game
2014-05-13 17:38
375 查看
这题太恶心了。。。RE了二十几次。。。
拿STL会更简单,不过既然是为了练hash,就用hash做的
下面是hash的算法
这个是STL的算法
拿STL会更简单,不过既然是为了练hash,就用hash做的
下面是hash的算法
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define MAXD 50 + 10 #define MAX_SIZE 1 << 16 #define N 10005 int n,m; int head[MAX_SIZE]; int next[MAX_SIZE]; int G[MAXD][MAXD]; int t[MAXD][MAXD]; void display(int G[MAXD][MAXD]){ for(int i = 0 ;i < n; i++){ for(int j = 0; j < n;j++) printf("%d ",G[i][j]); printf("\n"); } return ; } struct Grap{ int G[MAXD][MAXD]; }V ; void Memset(){ m = 0; for(int i = 0;i < MAX_SIZE ;i++) head[i] = -1; memset(G,0,sizeof(G)); return ; } int hash(int X[MAXD][MAXD]){ int Sum = 0; for(int i = 0; i < n;i++) for(int j = 0; j < n; j++){ Sum = Sum * 2; Sum += X[i][j]; Sum %= MAX_SIZE; } return Sum % MAX_SIZE; } void Get_Graph(int d){ if(d == 0) memcpy(t,G,sizeof(t)); else if(d == 1){ /*右90度*/ for(int i = 0 ,b = 0; i < n; i++ , b ++) for(int j = 0 ,a = n - 1; j < n; j ++,a--) t[i][j] = G[a][b]; } else if(d == 2){ /*左90度*/ for(int i = 0 ,b = n - 1; i < n; i++ , b --) for(int j = 0 ,a = 0; j < n; j ++,a ++) t[i][j] = G[a][b]; } else if(d == 3){/*180度*/ for(int i = 0 ,a = n - 1; i < n; i++ , a --) for(int j = 0 ,b = n - 1; j < n; j ++,b--) t[i][j] = G[a][b]; } else if(d == 4){ for(int i = 0 ,a = 0; i < n; i++ , a ++) for(int j = 0 ,b = n - 1; j < n; j ++,b--) t[i][j] = G[a][b]; } return ; } bool Try_to_insert(){ int h = hash(t); int e = head[h]; while(e != -1){ if(memcmp(V[e].G,t,sizeof(t)) == 0) return false; e = next[e]; } return true; } bool Add_List(){ int temp[MAXD][MAXD]; for(int i = 0; i <= 4 ;i++){ Get_Graph(i); if(i == 0) memcpy(temp,t,sizeof(temp)); if(!Try_to_insert()) return false; /*如果无法插入*/ } int h = hash(temp); memcpy(V[m].G,temp,sizeof(temp)); next[m] = head[h]; head[h] = m; m ++; return true; } int main(){ int p,q; char r; while(scanf("%d",&n) && n){ Memset(); int ok = 1; int cnt ; for(int i = 0; i < 2 * n; i++){ scanf("%d %d %c",&p,&q,&r); if(r == '+') G[p - 1][q - 1] = 1; else G[p - 1][q - 1] = 0; if(!Add_List() && ok == 1){ cnt = i; ok = 0; } } /*printf("%d\n",m); for(int i = 0;i< m;i++){ display(V[i].G); printf("==========\n"); }*/ if(ok == 0){ if(cnt & 1) printf("Player 1 wins on move %d\n",cnt + 1); else printf("Player 2 wins on move %d\n",cnt + 1); } if(ok) printf("Draw\n"); } return 0; }
这个是STL的算法
#include <stdio.h> #include <string.h> #include <set> #include <iostream> using namespace std; const int N = 55; set<string> vec; int g , n, flag; char str[4][N * N]; void handle() { memset(str, 0, sizeof(str)); int t = 0, k = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) str[k][t++] = g[i][j] + '0'; str[k++][t] = '\0'; t = 0; for (int j = n - 1; j >= 0; j--) for (int i = 0; i < n; i++) str[k][t++] = g[i][j] + '0'; str[k++][t] = '\0'; t = 0; for (int j = 0; j < n; j++) for (int i = n - 1; i >= 0; i--) str[k][t++] = g[i][j] + '0'; str[k++][t] = '\0'; t = 0; for (int i = n - 1; i >= 0; i--) for (int j = n - 1; j >= 0; j--) str[k][t++] = g[i][j] + '0'; str[k++][t] = '\0'; } int main() { int x, y; char c; while (scanf("%d", &n), n) { memset(g, 0, sizeof(g)); flag = 0; vec.clear(); for (int i = 1; i <= 2 * n; i++) { scanf("%d%d %c", &x, &y, &c); if (c == '+') g[x - 1][y - 1] = 1; else if (c == '-') g[x - 1][y - 1] = 0; handle(); if (!flag) { for (int j = 0; j < 4; j++) { if (vec.find(str[j]) != vec.end()) flag = i; } } if (!flag) { for (int j = 0; j < 4; j++) vec.insert(str[j]); } } if (flag % 2) printf("Player 2 wins on move %d\n", flag); else if (flag) printf("Player 1 wins on move %d\n", flag); else printf("Draw\n"); } return 0; }
相关文章推荐
- c++对象数组和this指针
- Linux下音乐乱码
- IEnumerable IEnumerator
- Linux下DIR,dirent,stat等结构体详解
- Linux 启动过程分析
- MVC缺点
- IEnumerable IEnumerator 分类: .NET 2014-05-13 17:38 350人阅读 评论(0) 收藏
- 委托再学习
- Form表单标签的Enctype属性的作用及应用示例介绍
- 就是在这样一个落英纷飞的四月
- makefile write
- 几个关于嵌入式C的面试问题【转】
- hdu4570 Multi-bit Trie
- arm-linux编译链接过程
- install shield向导
- 没写DOCTYPE造成的bootstrap对IE8的不兼容
- 验证1
- 求大神指导哪里错了
- 西北的四月,虽然有时尘沙浮漫
- Ubuntu 下安装 Darwin Streaming server 流媒体服务器