From 8670cc78da64a0675083a900faccfd003f5e69b1 Mon Sep 17 00:00:00 2001 From: shadow Date: Sun, 23 Dec 2018 23:29:12 +0800 Subject: [PATCH] update --- ...0\264\252\345\277\203_Aggressive cows.cpp" | 41 +++++++++++++ .../\345\271\277\346\220\234_Flip Game.cpp" | 59 ++++++++++++++++++ ...7\345\256\253\351\227\256\351\242\230.cpp" | 60 +++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 "\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\344\272\214\345\210\206\350\264\252\345\277\203_Aggressive cows.cpp" create mode 100644 "\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\345\271\277\346\220\234_Flip Game.cpp" create mode 100644 "\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\345\271\277\346\220\234_\350\277\267\345\256\253\351\227\256\351\242\230.cpp" diff --git "a/\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\344\272\214\345\210\206\350\264\252\345\277\203_Aggressive cows.cpp" "b/\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\344\272\214\345\210\206\350\264\252\345\277\203_Aggressive cows.cpp" new file mode 100644 index 0000000..d99332f --- /dev/null +++ "b/\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\344\272\214\345\210\206\350\264\252\345\277\203_Aggressive cows.cpp" @@ -0,0 +1,41 @@ +/*** + 牛跟牛之间有安全距离 即最小距离 + 要求这个安全距离的最大值 + ***/ +#include +#include +using namespace std; + +const int maxn = 100010; +int n, c; +int stall[maxn] = {0}; + +bool check(int tmpdis) { // 验证按照tmpdis的间隔 能否安排全部C头牛 + int nCow = 0; // 已安置的牛数量 + int nowRight = stall[0]; // 把第一头牛放在第一个区间 + for (int i = 1; i <= n; ++i) { + if (nowRight <= stall[i]) { // 如果已安排区间的右端点在下一个栏点左边 则该右端点和该栏点构成一个新区间 可以安排进一只牛 + ++nCow; nowRight = stall[i] + tmpdis; + } + } + if (nCow >= c) return true; // 如果可以安排的牛数>=给定的牛数 + else return false; +} + +int main() { + scanf("%d %d", &n, &c); + for (int i = 1; i <= n; ++i) scanf("%d", &stall[i]); + sort(&stall[1], (&stall[1])+n); + int left = 1, right = (stall[n]-stall[0]) / (c-1), ans = 0; + int mid = 0; // 如果只有一个栏点 right=0 + while (left <= right) { + mid = (left + right) / 2; + if (check(mid)) { + ans = mid; // 保存此时的mid值 因为之后进行到退出循环操作时check(mid)可能是无效的 + left = mid + 1; + } + else right = mid-1; // 牛安排不完 tmpdis要拉小 右端点左移 + } + printf("%d\n", ans); + return 0; +} diff --git "a/\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\345\271\277\346\220\234_Flip Game.cpp" "b/\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\345\271\277\346\220\234_Flip Game.cpp" new file mode 100644 index 0000000..17454c0 --- /dev/null +++ "b/\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\345\271\277\346\220\234_Flip Game.cpp" @@ -0,0 +1,59 @@ +#include +using namespace std; + +int chess[4][4]; +int mincnt = 17; // 棋子翻转偶数次=翻转0次 翻转奇数次=翻转1次 所以最多翻16次 初始化为非法值 + +void build() { + char c; + for (int i = 0; i < 4; ++i) { + for (int j = 0; j <4; ++j) { + cin >> c; + if (c == 'w') chess[i][j] = 0; + else chess[i][j] = 1; + } + } +} + +void turn(int x, int y) { // 翻转第x行y列的棋子 + if (x >= 0 && x < 4 && y >= 0 && y < 4) chess[x][y] = !chess[x][y]; +} + +void flip(int now) { // 模拟翻转第now个棋子 + int i = now / 4; // 行号 + int j = now % 4; // 列号 + turn(i,j); + turn(i+1,j); + turn(i,j+1); + turn(i-1,j); + turn(i,j-1); +} + +bool complete() { + int cnt = 0; + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) cnt += chess[i][j]; + } + if (cnt % 16 == 0) return true; // 如果cnt为16全黑或为0全白 + else return false; +} + +void dfs(int now, int flipCnt) { // now当前棋子 flipCnt翻转的棋子个数 + if (complete()) { + if (mincnt > flipCnt) mincnt = flipCnt; // 更新mincnt + return; + } + if (now >= 16) return; // 棋子全部翻过一遍 + dfs(now+1, flipCnt); // 不翻转now的分支 + flip(now); // 翻转now的分支 + dfs(now+1, flipCnt+1); + flip(now); // 结束翻转now的分支 还原状态 +} + +int main() { + build(); + dfs(0, 0); + if (mincnt == 17) cout << "Impossible" << endl; + else cout << mincnt << endl; + return 0; +} diff --git "a/\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\345\271\277\346\220\234_\350\277\267\345\256\253\351\227\256\351\242\230.cpp" "b/\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\345\271\277\346\220\234_\350\277\267\345\256\253\351\227\256\351\242\230.cpp" new file mode 100644 index 0000000..c436a46 --- /dev/null +++ "b/\345\214\227\345\244\247\347\250\213\345\272\217\350\256\276\350\256\241\344\270\216\347\256\227\346\263\225\344\270\223\351\241\271\350\257\276\347\250\213/\347\256\227\346\263\225\345\237\272\347\241\200/\345\271\277\346\220\234_\350\277\267\345\256\253\351\227\256\351\242\230.cpp" @@ -0,0 +1,60 @@ +#include +#include +#include +using namespace std; + +struct node { + int x, y, data; + node* pre; + node() { + pre = NULL; + } +}matrix[5][5]; + +int inq[5][5] = {0}; +int ans = 50; vector path; +int X[4] = {1, -1, 0, 0}; +int Y[4] = {0, 0, 1, -1}; + +bool judge(int x, int y) { + if (x < 0 || x > 4 || y < 0 || y > 4 || matrix[x][y].data || inq[x][y]) return false; + return true; +} + +void bfs() { + queue Q; + Q.push(matrix[0][0]); + while (!Q.empty()) { + node fro = Q.front(); Q.pop(); + inq[0][0] = 1; + if (fro.x == 4 && fro.y == 4) return; + for (int i = 0; i < 4; ++i) { + int newX = fro.x + X[i], newY = fro.y+Y[i]; + if (judge(newX, newY)) { + node Node; Node.x = newX; Node.y = newY; + matrix[newX][newY].pre = &(matrix[fro.x][fro.y]); // 队列传入的是副本~所以手动操作matrix + Q.push(Node); inq[Node.x][Node.y] = 1; + } + } + } +} + +int main() { + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 5; ++j) { + scanf("%d", &matrix[i][j].data); + matrix[i][j].x = i; matrix[i][j].y = j; + } + } + bfs(); + node* ptr = &(matrix[4][4]); + while (ptr != NULL) { + path.push_back(*(ptr)); + ptr = ptr->pre; + } + for (int i = path.size()-1; i >= 0; --i) { + printf("(%d, %d)\n", path[i].x, path[i].y); + } + return 0; +} +