hihoCoder#1114 小Hi小Ho的惊天大作战:扫雷・一 - 李舜阳 - 博客园


http://hihocoder.com/problemset/problem/1114
“我们还是循序渐进,先来考虑这样一个简单化问题:”小Hi思索片刻,道:“在一个大小为2*N的广场,其中第一行里的某一些格子里可能会有至多一个地雷,而第二行的格子里全都为数字,表示第一行中距离与这个格子不超过2的格子里总共有多少个地雷,即第二行的第i个格子里的数字表示第一行的第i-1个, 第i个, 第i+1个,三个格子(如果i=1或者N则不一定有三个)里的地雷的总数。”
“而我们要做的是——找出哪些地方一定是雷,哪些地方一定不是雷。”小Ho道:“不然,我可就要光荣牺牲了。”

输入

每个测试点(输入文件)存在多组测试数据。
每个测试点的第一行为一个整数Task,表示测试数据的组数。
在一组测试数据中:
第1行为1个整数N,表示迷宫的宽度。
第2行为N个整数A_1 ... A_N,依次表示迷宫第二行的N个格子里标注的数字。
对于100%的数据,满足1<=N<=10^5, 0<=a_i<=3.<>
对于100%的数据,满足符合数据描述的地图一定存在。

输出

对于每组测试数据,输出2行,其中第一行先输出一定为地雷的格子的数量,然后按照从小到大的顺序输出所有一定为地雷的格子的位置,第二行先输出一定不为地雷的格子的数量,按照从小到大的顺序输出所有一定不为地雷的格子的位置。


样例输入
2
3
1 1 1
10
1 2 1 2 2 3 2 2 2 2 
样例输出
1 2
2 1 3
7 1 3 5 6 7 9 10 
3 2 4 8 

http://beeder.github.io/2015/05/29/hihoCoder-Problem-1114/  每个点只有0个或1个雷,只要确定了第一个点的雷数,后面的雷数就依次确定了。所以最多有两种情况:第一个点有0个或1个雷。

  假设第一个点有0个或1个雷,通过计算可得所有点的雷数,如果雷数不符合题意,则假设不合理。然后再确定所有合法方案中一定有雷或无雷的点。
const int kMax = 100005;
int n;
int mine10[kMax];
int mine11[kMax];
int mine2[kMax];
int yes_id[kMax];
int no_id[kMax];
bool Sub(int x,int *mine1x)
{
mine1x[0] = 0;
mine1x[1] = x;
for (int i = 2; i <= n; i++)
{
mine1x[i] = mine2[i - 1] - mine1x[i - 1] - mine1x[i - 2];
if (mine1x[i] != 0 && mine1x[i] != 1)
return false;
}
if (mine1x[n] + mine1x[n - 1] != mine2[n])
return false;
return true;
}
void Solve()
{
bool ans0=Sub(0,mine10);
bool ans1=Sub(1,mine11);
int yes_num = 0, no_num = 0;
if (ans0&&!ans1)
{
for (int i = 1; i <= n; i++)
{
if (mine10[i] == 1)
yes_id[yes_num++] = i;
else
no_id[no_num++] = i;
}
}
else if (!ans0&&ans1)
{
for (int i = 1; i <= n; i++)
{
if (mine11[i] == 1)
yes_id[yes_num++] = i;
else
no_id[no_num++] = i;
}
}
else if (ans0&&ans1)
{
for (int i = 1; i <= n; i++)
{
if (mine10[i] == mine11[i])
{
if (mine10[i] == 1)
yes_id[yes_num++] = i;
else
no_id[no_num++] = i;
}
}
}
printf("%d ", yes_num);
for (int i = 0; i < yes_num; i++)
printf("%d ", yes_id[i]);
printf("\n");
printf("%d ", no_num);
for (int i = 0; i < no_num; i++)
printf("%d ", no_id[i]);
printf("\n");
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &mine2[i]);
Solve();
}
return 0;
}

hihoCoder#1114 小Hi小Ho的惊天大作战:扫雷・一 - 李舜阳 - 博客园
回溯+搜索
枚举每个位置上能否放地雷,当第i个位置枚举完成后,第i-1个位置的情况就确定了,此时,检查第i-1个位置是否满足要求,即左右间隔为1的范围内地雷数是否等于申明数字,如果满足条件,那么继续搜索下去,如果不满足条件,抛弃这个搜索分支。
搜索完成后,将所有可行解按位置"与"一下 ,找到那些一定为地雷或一定为空的格子。
 6 void merge(int *t, int *r, int n) {
 7   for (int i = 0; i < n; i++) {
 8     if (t[i] == -1 || t[i] == r[i])
 9       t[i] = r[i];
10     else
11       t[i] = -2;
12   }
13 }
14 
15 void find(int *a, int *r, int *t, int p, int n) {
16   if (p >= n) {
17     if ((n == 1 && a[p - 1] == r[p - 1])
18         || ((n > 1) && a[p - 1] == r[p - 1] + r[p - 2]))
19       merge(t, r, n);
20   }
21   else if (p == 0) {
22     for (int i = 0; i < 2; i++) {
23       r[p] = i;
24       find(a, r, t, p + 1, n);
25     }
26   }
27   else if (p == 1) {
28     for (int i = 0; i < 2; i++) {
29       r[p] = i;
30       if (a[p - 1] == r[p - 1] + r[p])
31         find(a, r, t, p + 1, n);
32     }
33   }
34   else {
35     for (int i = 0; i < 2; i++) {
36       r[p] = i;
37       if (a[p - 1] == r[p] + r[p - 1] + r[p - 2])
38         find(a, r, t, p + 1, n);
39     }
40   }
41 }
42 
43 int main() {
44   int n;
45 
46   cin >> n;
47   while (n--) {
48     int N;
49     cin >> N;
50     int *a = new int[N];
51     int *r = new int[N];
52     int *t = new int[N];
53 
54     for (int i = 0; i < N; i++)
55       cin >> a[i];
56     memset(r, 0, N * sizeof(int));
57     memset(t, -1, N * sizeof(int));
58 
59     find(a, r, t, 0, N);
60 
61     int mine = 0;
62     int not_mine = 0;
63 
64     for (int i = 0; i < N; i++) {
65       mine += (t[i] == 1 ? 1 : 0);
66       not_mine += (t[i] == 0 ? 1 : 0);
67     }
68 
69     cout << mine;
70     for (int i = 0; i < N; i++)
71       if (t[i] == 1)
72         cout << " " << i + 1;
73     cout << endl;
74 
75     cout << not_mine;
76     for (int i = 0; i < N; i++)
77       if (t[i] == 0)
78         cout << " " << i + 1;
79     cout << endl;
80 
81     delete t;
82     delete r;
83     delete a;
84   }
85 
86   return 0;
87 }
http://www.aiuxian.com/article/p-2162945.html
int a[N],vis[N],ans[N],n,yes;  //vis是标记有无雷
int YES[N],NO[N];

bool judge(int pos)
{
if(pos==1)
{
if(n==1)
return vis[pos]==a[pos];
return a[pos]>=vis[pos];
}

if(pos==2)
{
int temp=vis[1]+vis[2];
if(n==2)
return a[1]==temp&&a[2]==temp;
return a[1]==temp;
}

int temp=vis[pos]+vis[pos-1]+vis[pos-2];

if(pos==n)
 return a[pos-1]==temp&&a[pos]==vis[pos]+vis[pos-1];

return a[pos-1]==temp;
}

void dfs(int pos)
{
int i,j;

    if(pos==n+1)
{
if(!yes)
{
yes=1;
for(i=1;i<=n;i++)   //第一次成功时复制到ans
ans[i]=vis[i];

return ;
}

for(i=1;i<=n;i++)
if(ans[i]!=vis[i])   //以后成功的情况看看有雷的地方是不是一定有雷
 ans[i]=-1;         //如果这种情况有雷,那种情况无雷这个点无法确定
return ;
}

vis[pos]=1;
if(judge(pos))
dfs(pos+1);

vis[pos]=0;
if(judge(pos))
dfs(pos+1);
}

void print()
{
int i,j,x,y;
x=0,y=0;

for(i=1;i<=n;i++)
{
if(ans[i]==1) YES[x++]=i;
if(ans[i]==0) NO[y++]=i;
}

printf("%d",x);
for(i=0;i<x;i++)
printf(" %d",YES[i]);
printf("\n");

printf("%d",y);
for(i=0;i<y;i++)
printf(" %d",NO[i]);
printf("\n");
}


int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
yes=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);

dfs(1);
print();
}
return 0;


}
http://m.blog.csdn.net/blog/piaocoder/47262185
Read full article from hihoCoder#1114 小Hi小Ho的惊天大作战:扫雷・一 - 李舜阳 - 博客园

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts