http://poj.org/problem?id=2965
借用某大神的思想。
他的思路是:
先看一个简单的问题,如何把'+'变成'-'而不改变其他位置上的状态?
答案是将该位置(i,j)及位置所在的行(i)和列(j)上所有的handle更新一次。
结果该位置被更新了7次,相应行(i)和列(j)的handle被更新了4次,剩下的被更新了2次.
被更新偶数次的handle不会造成最终状态的改变.
因此得出高效解法,在每次输入碰到'+'的时候, 计算所在行和列的需要改变的次数
当输入结束后,遍历数组,所有为奇数的位置则是操作的位置,而奇数位置的个数之和则是最终的操作次数.
再看他的代码
#include <stdio.h>#define Len 4
int main()
{
int i,j,step=0,Map[Len][Len]={0};
char k;
for(i=0;i<Len;i++)
{
for(j=0;j<Len;j++)
{
scanf(" %c",&k);
if(k=='+')
{
Map[i][j]++;
for(int y=0;y<Len;y++)
{
Map[i][y]++;
Map[y][j]++;
}
}
}
}//输入时进行处理,最后图中偶数点等价于被重复操作还原,奇数点等价于操作过的点。题目说的重复情况也要输出,按照这种思维想是不可能出现重复情况的。
for(i=0;i<Len;i++)
{
for(j=0;j<Len;j++)
{
if(Map[i][j]%2) step++;//统计奇数点个数
}
}
printf("%d\n",step);
for(i=0;i<Len;i++)
{
for(j=0;j<Len;j++)
{
if(Map[i][j]%2) printf("%d %d\n",i+1,j+1);//输出位置
}
}
}