当前位置: 首页 > news >正文

card

#include <bits/stdc++.h>
using namespace std;
#define P pair<char, char>
#define mp(x, y) make_pair(x, y)vector< P > oper_list;
const int len = 4;
const int wide = 4;
const int _size = len * wide;
const int _num = _size + (_size&1);
const int half = (_num >> 1);
const int _dir = 4;
const int maxs = 43046721;
char f[maxs], g[maxs];
int rev[maxs];
char step_forward[_size][_dir];
char board[_size], sum_board = 0;
char belong[_size], sum_belong = 0;
bool used[_num];
char card[_num][_dir];
int next_k = -1, next_x = -1;
char input_size = 0;
char now_player = 0;inline void Extend(int s,char *_map) {for (int i=0; i<_size; i++) _map[i] = s%3-1, s/=3;
}inline int Mark(char *_map) {int s=0;for (char i=_size-1; i>=0; i--) s = (s<<1) + s + (_map[i]+1);return s;
}inline int Rev(char *_map) {for (int i=0; i<_size; i++) if (_map[i] != -1) _map[i] = 1 - _map[i];return Mark(_map);
}char Dp(char *p, int s) {if (p[s] != -1) return p[s];if (p == f) {f[s] = 0;char _map[_size], new_map[_size];Extend(s, _map);for (char x=0; x<_size; x++) if (_map[x] == -1) {for (int i=0; i<_size; i++) new_map[i] = _map[i];new_map[x] = 1;char score = 0;for (char u=0; u<_dir; u++) {char move_to = step_forward[x][u];if (move_to == -1 || new_map[move_to] != 0) continue;++score;new_map[move_to] = 1;}int t = Mark(new_map);f[s] = max(f[s], (char)(score + Dp(g, t)));}}else {g[s] = 100;char _map[_size], new_map[_size];Extend(s, _map);for (char x=0; x<_size; x++) if (_map[x] == -1) {for (int i=0; i<_size; i++) new_map[i] = _map[i];new_map[x] = 0;int t = Mark(new_map);g[s] = min(g[s], Dp(f, t));}if (g[s] == 100) g[s] = 0;}return p[s];
}inline void Preprocess() {for (int i=0; i<_size; i++){if (i < wide) step_forward[i][0] = -1;else step_forward[i][0] = i - wide;if (i % len == 0) step_forward[i][1] = -1;else step_forward[i][1] = i - 1;if (i + wide < _size) step_forward[i][2] = i + wide;else step_forward[i][2] = -1;if (i % len == len - 1) step_forward[i][3] = -1;else step_forward[i][3] = i + 1;}memset(f, -1, sizeof(f));memset(g, -1, sizeof(g));char tmp_map[_size];for (int s=0; s<maxs; s++) {Dp(f, s);Dp(g, s);Extend(s, tmp_map);rev[s] = Rev(tmp_map);}
}inline void Simulate(char k, char x) {oper_list.push_back( mp(k, x) );board[x] = k;bool cur = (k >= half? 1: 0);sum_board += cur;belong[x] = cur;sum_belong += cur;used[k] = true;for (int u=0; u<_dir; u++) if (step_forward[x][u] != -1) {char move_to = step_forward[x][u];if (board[move_to] != -1) {char p = board[move_to];char &val = belong[move_to];if (val != cur) {char v = (u >= 2? u-2: u+2);if (card[k][u] > card[p][v]) {sum_belong -= val;val = cur;sum_belong += cur;}}}}
}inline void Initialize() {freopen("chess.in", "r", stdin);for (int i=0; i<_num; i++)for (int j=0; j<_dir; j++) {int val = 0;cin >> val;card[i][j] = val;}memset(board, -1, sizeof(board));memset(belong, -1, sizeof(belong));memset(used, false, sizeof(used));int k = -1, x = -1;cin >> k >> x;while (k >= 0) {Simulate(k, x);k = -1, x = -1;cin >> k >> x;}fclose(stdin);input_size = oper_list.size();
}inline void Reverse(char k, char x, char *tmp_belong, char tmp_sum) {oper_list.pop_back();board[x] = -1;if (k >= half) --sum_board;for (int i=0; i<_size; i++) belong[i] = tmp_belong[i];sum_belong = tmp_sum;used[k] = false;
}char Dfs(char cur, char min_limit, char max_limit) {char now_score = sum_belong - sum_board;if (oper_list.size() == _size) return now_score;char invalid = (cur? 100: -100);int s = Mark(belong);int t = rev[s];if (cur) {if (now_score - g[t] >= max_limit) return invalid;if (now_score + f[s] <= min_limit) return min_limit;}else {if (now_score + g[s] <= min_limit) return invalid;if (now_score - f[t] >= max_limit) return max_limit;}char top_score = -invalid;char enemy = (cur == 0? half: 0);char tmp_sum = sum_belong;char tmp_belong[_size];for (int i=0; i<_size; i++) tmp_belong[i] = belong[i];for (char k=cur; k< cur + half; k++) if (!used[k])for (char x=0; x<_size; x++) if (board[x] == -1) {Simulate(k, x);char score = Dfs(enemy, min_limit, max_limit);Reverse(k, x, tmp_belong, tmp_sum);if (cur) {if (score >= max_limit) return invalid;if (score <= min_limit) continue;min_limit = score;if (score > top_score) {top_score = score;if (oper_list.size() == input_size) next_k = k, next_x = x;}}else {if (score <= min_limit) return invalid;if (score >= max_limit) continue;max_limit = score;if (score < top_score) {top_score = score;if (oper_list.size() == input_size) next_k = k, next_x = x;}}}if (top_score == -invalid) {if (cur) return min_limit;else return max_limit;}return top_score;
}int main(void) {Preprocess();Initialize();now_player = ((oper_list.size() > 0) && (oper_list.rbegin()->first >= half)? 0: half);clock_t start = clock();int ans = Dfs(now_player, -100, 100);clock_t end = clock();cout << (end - start) / 1000000.0 << endl;cout << ans << endl;cout << next_k << " " << next_x << endl;for (int i=0; i<_dir; i++) cout << (int)card[next_k][i] << " ";return 0;
}
http://www.jsqmd.com/news/9273/

相关文章:

  • Ai元人文系列:领域协同深耕:构建人机价值共生的文明实践框架
  • 如何监测光伏系统中的电能质量挑战?分布式光伏电能质量解决方案
  • NFL统一数据生态系统技术架构解析
  • 深入解析:【C++项目】负载均衡在线OJ系统-1
  • 复习题集
  • 实用指南:SCDN如何同时保障网站加速与DDoS防御?
  • 二分查找模板:基础二分与进阶二分
  • 【设计模式-4.5】行为型——迭代器模式 - 教程
  • 浅谈并查集
  • SP6950 CTOI10D3 - A HUGE TOWER 题解
  • Kubernetes 定时备份etcd数据
  • 16_AiAgentMCP简单教程
  • 17_AiAgentMCP实现技术选型
  • JVM_XMS 和 java_opts哪种写法对?如何在JVM中设置JVM_XMS和java_opts?
  • 鸿蒙编译ffmpeg库 - 详解
  • 知道却做不到
  • 详细介绍:003 flutter初始文件讲解(2)
  • WinReanimator恶意软件清除指南:详细步骤与工具使用
  • Git的使用技巧 - 教程
  • 字节跳动开源图标库:2000+图标一键换肤的魔法 - 教程
  • Photoshop启用钢笔绘制图形
  • 代码随想录打卡|Day51 图论(dijkstra(堆优化版)精讲、Bellman_ford 算法精讲) - 教程
  • 自动化数据操作平台获3000万美元融资
  • 常见排序算法详解与C语言实现 - 详解
  • AtCoder Beginner Contest 422 游记(VP)
  • 详细介绍:无人机光纤FC接口模块技术分析
  • 2025 --【J+S 二十连测】-- 第十三套 总结
  • 文件提供的基本操作
  • yarn、pnpm、npm - 指南
  • 基于Linux环境docker封装exe