Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
求大神指点:在visual studio 2017上执行没有问题,什么到了POJ就显示wrong answer?// 算法思想:①将牌局映射到一维的只函0,1的数组,以便用取非运算模拟翻牌。②翻牌顺序不影响结果,可以每次都是从编号低的格子往编号高的格子翻。例如,当前考虑是否翻第5个格子时,之后就不用考虑前4个格子了。 #include "stdafx.h" #include "stdio.h" #define INF 999999999 char a[10][10]; int map[100]; int min_rounds = INF,flag; int main() { void flip_rounds(int x,int rounds); //当前格局为a,选中a[i][j],那么实现目标最少需要翻多少轮 int i, j, k; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { scanf_s("%c", &a[i][j], 1); k = 4 * i + j; //转换为一维数组,以方便采用深搜和广搜策略处理。相应的一维数据的位置 if (a[i][j] =='b') //将b映射为0,w映射为1,以方便通过取非运算进行状态转换 map[k] = 0; else map[k] = 1; } // getchar(); } flip_rounds(0, 0); if (min_rounds == INF) printf_s("Impossible\n"); else printf_s("%d\n", min_rounds); return 0; } void flip_rounds(int x,int rounds) //因为翻牌顺序不影响结果,可以每次都是从编号低的格子往编号高的格子翻 { int judge(); void flip(int x); flag = judge(); if (x >= 16) return; if (flag == 1) { if (rounds < min_rounds) min_rounds = rounds; return; } else { flip(x); //翻转当前牌及其上下左右的牌 rounds++; flip_rounds(x + 1,rounds); flip(x); //复原 rounds--; flip_rounds(x+1,rounds); } } int judge() //判断是否已全部为黑面朝上,或全部为白面朝上 { int i; for (i = 1; i < 16; i++) { if (map[i] != map[0]) return 0; } return 1; } void flip(int x) //翻转a[i][j]及其上下左右棋子 { map[x] = !map[x]; //翻转[i][j] if (x - 4 >= 0) //翻转上面的[i-1][j] map[x - 4] = !map[x - 4]; if (x + 4 < 16) //翻转下面的[i+1][j] map[x + 4] = !map[x + 4]; if (x != 0 && x != 4 && x != 8 && x!=12) //翻转左边的[i][j-1] map[x - 1] = !map[x - 1]; if (x != 3 && x != 7 && x != 11 && x != 15) //翻转右边的[i][j+1] map[x + 1] = !map[x + 1]; return; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator