题目传送门

只打了三个小时。

A. Broadcast Stations

 

B. Connect3

补题:zz

题解:因为格子是4*4的,而且每次落子的位置最多是只有四个,再加上剪枝,情况不会很多,直接爆搜就行了,再用三进制记录已经合法的情况,去掉重复的情况就行了。(用vs2017交会ac,但c++17会wa1,很奇怪)

//#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
#include<cmath>
#include<time.h>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
#include<numeric>
#include<stack>
#include<bitset>
#include<unordered_map>
const int maxn = 0x3f3f3f3f;
const double EI = 2.71828182845904523536028747135266249775724709369995957496696762772407663035354594571382178525166427;
const double PI = 3.141592653589793238462643383279;
//#ifdef TRUETRUE
//#define gets gets_s
//#endif
using namespace std;
int a, b;
int ans;
map<int, int>mp;
bool Judge(int c[10][10], int aa, int bb, int pos)
{
    if (aa == a && bb == b && pos == 1)
    {
        return false;
    }
    int cc[10][10], i, j;
    for (i = 1; i <= 4; i++)
    {
        for (j = 1; j <= 4; j++)
        {
            cc[i + 1][j + 1] = c[i][j];
        }
    }
    aa++;
    bb++;
    bool flag = false;
    if (cc[aa][bb] == cc[aa - 1][bb] && cc[aa][bb] == cc[aa - 2][bb]
        || cc[aa][bb] == cc[aa + 1][bb] && cc[aa][bb] == cc[aa + 2][bb]
        || cc[aa][bb] == cc[aa][bb - 1] && cc[aa][bb] == cc[aa][bb - 2]
        || cc[aa][bb] == cc[aa][bb + 1] && cc[aa][bb] == cc[aa][bb + 2]
        || cc[aa][bb] == cc[aa + 1][bb + 1] && cc[aa][bb] == cc[aa + 2][bb + 2]
        || cc[aa][bb] == cc[aa - 1][bb - 1] && cc[aa][bb] == cc[aa - 2][bb - 2]
        || cc[aa][bb] == cc[aa - 1][bb] && cc[aa][bb] == cc[aa + 1][bb]
        || cc[aa][bb] == cc[aa][bb - 1] && cc[aa][bb] == cc[aa][bb + 1]
        || cc[aa][bb] == cc[aa - 1][bb - 1] && cc[aa][bb] == cc[aa + 1][bb + 1]
        || cc[aa][bb] == cc[aa - 1][bb + 1] && cc[aa][bb] == cc[aa - 2][bb + 2]
        || cc[aa][bb] == cc[aa + 1][bb - 1] && cc[aa][bb] == cc[aa + 2][bb - 2]
        || cc[aa][bb] == cc[aa - 1][bb + 1] && cc[aa][bb] == cc[aa + 1][bb - 1])
    {
        flag = true;
    }
    if (flag && pos == 2 && aa - 1 == a && bb - 1 == b)
    {
        int tmp = 0;
        for (i = 1;i <= 4;i++)
        {
            for (j = 1;j <= 4;j++)
            {
                tmp *= 3;
                tmp += c[i][j];
            }
        }
        if (!mp[tmp])
        {
            ans++;
            mp[tmp] = 1;
        }
        return false;
    }
    if (flag || (!flag && aa - 1 == a && bb - 1 == b))
    {
        return false;
    }
    else
    {
        return true;
    }
}
void f(int c[10][10], int d[10], int pos)
{
    int i;
    for (i = 1; i <= 4; i++)
    {
        if (d[i] <= 4)
        {
            c[d[i]][i] = pos;
            int dd[10][10];
            for (int ii = 1;ii <= 4;ii++)
            {
                memcpy(dd[ii], c[ii], sizeof(c[ii]));
            }
            if (Judge(dd, d[i], i, pos))
            {
                d[i]++;
                f(dd, d, 3 - pos);
                d[i]--;
            }
            c[d[i]][i] = 0;
        }
    }
}
void init(void)
{
    mp.clear();
}
int main(void)
{
    //ios::sync_with_stdio(false);
    int x;
    while (~scanf("%d %d %d", &x, &a, &b))
    {
        init();
        int c[10][10];
        int d[10] = { 1,1,1,1,1,1,1,1,1,1 };
        d[x]++;
        memset(c, 0, sizeof(c));
        c[1][x] = 1;
        ans = 0;
        f(c, d, 2);
        printf("%d\n", ans);
    }
    return 0;
}
View Code

相关文章:

  • 2022-03-03
  • 2021-06-27
  • 2021-06-12
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-08-12
  • 2022-12-23
  • 2021-11-19
  • 2021-05-16
  • 2021-10-23
相关资源
相似解决方案