您的位置:首页 > 其它

141 The Spot Game

2014-05-13 17:38 375 查看
这题太恶心了。。。RE了二十几次。。。

拿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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: