题目链接:http://poj.org/problem?id=2965
题解:自己想到的方法是枚举搜索,结果用bfs和dfs写都超时了。网上拿别人的代码试一下只是刚好不超时的,如果自己的代码在某些方面不够优化,那超时很正常。看来这题用dfs和bfs都不是好办法。 然后又看到比较厉害的技巧:“可知翻偶数次等于没翻,即没有翻的必要,翻奇数次的结果与翻一次的结果一样“”。有了这个重要结论,那么可以具体操作了:设一个二维数组以记录每个的翻转次数。对于每个‘+’,都翻转其所在的行列(注意‘+’只翻一次),然后更新翻转次数。最后统计翻转次数为奇数的,即为实际需要翻转的。(为什么我没想到这种方法。需要仔细体会这种思维)
代码如下:
#include<stdio.h>//poj2965
#include<string.h>
int main()
{
int a[5][5],sum;
char map[5][5];//map开一维已足够
memset(a,0,sizeof(a));
for(int i = 0; i<4; i++)
{
scanf("%s",map[i]);
for(int j = 0; j<4; j++)
{
if(map[i][j]=='+')