codevs 1004 四子连棋

Posted Herminone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs 1004 四子连棋相关的知识,希望对你有一定的参考价值。

bfs

题目链接:http://codevs.cn/problem/1004/

 

搜索不解释了。

不过好像我写的queue还不如不写QAQAQ

Codes:

#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>

using namespace std;
const int p = 3733799;
struct data{
    int mp[5][5];
}d[5000 + 10];
int nxt[5000] = {1,2};//下一步走哪个颜色 1:w 2:b 0:o 
int step[5000 + 10];
bool hashh[40000000 + 10];
char s[5][5];
int xx[] = {0,0,0,1,-1},yy[] = {0,1,-1,0,0};
int head = 0,tail,f = 0;

bool same(int a1,int a2,int a3,int a4){
    if(a1 != a2 || a2 != a3 || a3 != a4 || a4 != a1)
        return 0;
    return 1;
}
bool check(){
    for(int i = 1;i <= 4;++ i){
        if(same(d[tail].mp[i][1],d[tail].mp[i][2],d[tail].mp[i][3],d[tail].mp[i][4])) return 1;
        if(same(d[tail].mp[1][i],d[tail].mp[2][i],d[tail].mp[3][i],d[tail].mp[4][i])) return 1;
    }
    if(same(d[tail].mp[1][1],d[tail].mp[2][2],d[tail].mp[3][3],d[tail].mp[4][4])) return 1;
    if(same(d[tail].mp[1][4],d[tail].mp[2][3],d[tail].mp[3][2],d[tail].mp[4][1])) return 1;
    return 0;
}
int Hash(){
    int ans = 0;
    for(int i = 1;i <= 4;++ i){
        for(int j = 1;j <= 4;++ j){
            ans = ans * 3 + d[tail].mp[i][j];
        }
    }
    ans %= p;
    if(!hashh[ans]){
        hashh[ans] = 1;
        return 1;
    }
    return 0;
}
bool cana(int x,int y){
    int k = nxt[head];
    if(x > 4 || x < 1 || y > 4 || y < 1) return false;
    if(d[head].mp[x][y] == k) return true;
    return false;
}
queue <int> q;
void move(int x,int y){
    //head = q.front();
    for(int i = 1;i <= 4;++ i){
        int lx = x + xx[i],ly = y + yy[i];
        if(cana(lx,ly)){
            for(int j = 1;j <= 4;++ j){
                for(int k = 1;k <= 4;++ k){
                    d[tail].mp[j][k] = d[head].mp[j][k];
                }
            }
            swap(d[tail].mp[x][y],d[tail].mp[lx][ly]);
            step[tail] = step[head] + 1;
            if(check()){
                cout << step[tail] << \n;
                f = 1;
                return;
            }
            if(Hash()){
                if(nxt[head] == 1){
                    nxt[tail] = 2;
                    tail ++;
                    q.push(tail);
                } 
                if(nxt[head] == 2){
                    nxt[tail] = 1;
                    tail ++;
                    q.push(tail);
                }
            }
        }
    }
}
void search(){
    q.push(0);
    q.push(1);
    head = q.front();
    tail = 2;
    while(!q.empty()){
        head = q.front();
        for(int i = 1;i <= 4;++ i)
            for(int j = 1;j <= 4;++ j){
                if(!d[head].mp[i][j])
                    move(i,j);
                if(f)
                    return;
            }
        q.pop();
    }
}

int main(){
    for(int i = 1;i <= 4;++ i)
        scanf("%s",s[i] + 1);
    for(int i = 1;i <= 4;++ i){
        for(int j = 1;j <= 4;++ j){
            if(s[i][j] == W)
                d[0].mp[i][j] = d[1].mp[i][j] = 1;
            if(s[i][j] == B)
                d[0].mp[i][j] = d[1].mp[i][j] = 2;    
        }
    }
    search();
    return 0;
}

 

以上是关于codevs 1004 四子连棋的主要内容,如果未能解决你的问题,请参考以下文章

codevs 1004 四子连棋

codevs1004四子连棋[BFS 哈希]

CODEVS——T 1004 四子连棋

CODEVS 1004四子连棋

迭代加深搜索[codevs1004 四子连棋]

宽度优先搜索神奇的状态压缩 CodeVs1004四子连棋