UVA12113 Overlapping Squares重叠的正方形 暴力破解
生活随笔
收集整理的這篇文章主要介紹了
UVA12113 Overlapping Squares重叠的正方形 暴力破解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:給定一個4*4的棋盤,用不超過6個2*2的紙片堆放出給出的圖案,問是否可行
分析:題目很簡單,不難想到枚舉紙片位置,每張紙片有9中放置方法,只有6張紙片,可以斷定不會超時。
題目難點在于數據處理,又是數據結構知識,如何表示數據。
開始我想把格子抽象到數組中,相同的格子用相同的數字表示,一共是4*4。然后直接搜索就完事了。
數據轉換部分:
/*cout << " #"<< endl;cout << " _ _ _ #" << endl;cout << "| |_ _|#" << endl;cout << "|_| |#" << endl;cout << " |_ _|#" << endl;*/string s[5]; int kase = 1;while (getline(cin,s[0])&&s[0][0]!='0') {memset(vis, 0, sizeof(vis));maxlen = 0;memset(target, 0, sizeof(target));for (int i = 1; i < 5; i++)getline(cin,s[i]);int ans = 1; int first1 = 0;for (int i = 1;i<5; i++) {int cnt = 0;int x1;int x2; int anr = 0;for (int j = 0; j < s[i].length()-1; j++) {if (s[i][j] == '|') {x1 = j; anr = 1;for (int z = j + 1; z < s[i].length()-1; z++) {if (s[i][z] == '|') {x2 = z;j = z - 1;int ok = 0;for (int w = x1 + 1; w < x2; w += 2) {if (i == first1+1) { if (!ok) { cnt = x1 / 2; ok = 1; }target[i - 1][cnt++] = ans; continue; }if (s[i - 1][w] == ' ') {if (!ok)cnt = x1 / 2;ok = 1;target[i - 1][cnt] = target[i - 2][cnt];cnt++;}}if (!ok) {for (int z = x1 + 1; z < x2; z += 2) {if (!ok) { cnt = x1 / 2; ok = 1; }target[i - 1][cnt++] = ans;}}ans++;break;}}}}if (anr == 0)first1 = i;}}然而數據實際上可以不用這樣處理,直接處理,每次放紙片,就在紙片的周圍加上“_”和“|”。再判斷是否和目標圖案相同。
不用特意去找正方形,而是將它們當成一個整體,一幅圖案。
#include <iostream> #include <algorithm> #include <queue> #include <stack> #include <cstdio> #include <string> #include <string.h> #include <vector> #include <set> #include <cmath> #define LL long long #define INF 0x3f3f3f3f #define mod 1000000007 const int maxn = 1000000 + 5; using namespace std; string s[10]; int ans[10][10]; int maps[10][10]; void putmap(int op) {int row = op / 3;int col = 2 * (op % 3);maps[row][col + 1] = maps[row][col + 3] = 2;maps[row + 2][col + 1] = maps[row + 2][col + 3] = 2;maps[row + 1][col] = maps[row + 1][col + 4] = 1;maps[row + 2][col] = maps[row + 2][col + 4] = 1;maps[row + 2][col + 2] = 0;maps[row + 1][col + 1] = maps[row + 1][col + 2] = maps[row + 1][col + 3] = 0; } bool judge() {for (int i = 0; i < 5; i++) {for (int j = 0; j < 9; j++) {if (ans[i][j] != maps[i][j])return false;}}return true; } bool dfs(int step) {if (step > 6) return false;for (int i = 0; i < 9; i++) {int remaps[5][10];for (int k = 0; k < 5; k++)for (int j = 0; j < 9; j++) {remaps[k][j] = maps[k][j];}putmap(i);if (judge()) return true;if (dfs(step + 1)) return true;for (int k = 0; k < 5; k++)for (int j = 0; j < 9; j++) {maps[k][j] = remaps[k][j];}}return false; } int main() {int kases = 1;while (getline(cin,s[0])) {memset(ans, 0, sizeof(ans));memset(maps, 0, sizeof(maps));if (s[0][0] == '0') break;for (int i = 1; i < 5; i++)getline(cin,s[i]);for (int i = 0; i < 5; i++) {for (int j = 0; j < 9; j++) {if (s[i][j] == '|')ans[i][j] = 1;else if (s[i][j] == '_')ans[i][j] = 2;}}printf("Case %d: ", kases++);if (dfs(1)) printf("Yes\n");else printf("No\n");} }?
總結
以上是生活随笔為你收集整理的UVA12113 Overlapping Squares重叠的正方形 暴力破解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA690 Pipeline Sche
- 下一篇: UVA12107Digit Puzzle