http://poj.org/problem?id=2965
这个题的话,一开始也不会做,旁边的人说用BFS,后来去网上看了众大神的思路,瞬间觉得用BFS挺简单易;因为要让一个“+”变为“-”,只要将加号所在的位置(i,j)的行和列上的7个元素全部改变一次,这样的话(i,j)这个点将会变化7次,而 i 行上和 j 列另外六个元素将会变化4次,剩下的那些会变化2次,显而易见的是,一个位置上若翻转偶数次相当于没翻转,所以,只要记录下奇数次的翻转进行相加就可以了。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cstdlib> 5 using namespace std ; 6 char ans[6][6]; 7 int flag[6][6]; 8 int main() 9 { 10 memset(flag,0,sizeof(flag)); 11 for(int i = 0 ; i <= 3 ; i++) 12 { 13 scanf("%s",ans[i]);//这个题输入的时候我用的两个for循环输入数组里,但是错了。。 14 } 15 for(int i = 0 ; i <= 3 ; i++) 16 { 17 for(int j = 0 ; j <= 3 ; j++) 18 { 19 //scanf("%c",&ans) ; 20 if(ans[i][j] == '+') 21 { 22 for(int k = 0 ; k <= 3 ; k++) 23 { 24 //加号所在的位置行列的翻转次数全加一。 25 flag[i][k]++ ; 26 flag[k][j]++ ; 27 } 28 flag[i][j]-- ;//上边两次多加了一次这个,所以在这里减1 ; 29 } 30 } 31 } 32 int sum = 0 ; 33 for(int i = 0 ; i <= 3 ; i++) 34 { 35 for(int j = 0 ; j <= 3 ; j++) 36 { 37 sum += flag[i][j]%2 ;//遍历整个数组,凡是为奇数次的位置之和即为总的操作次数 38 } 39 } 40 printf("%d ",sum) ; 41 for(int i = 0 ; i <= 3 ; i++) 42 { 43 for(int j = 0 ; j <= 3 ; j++) 44 { 45 if(flag[i][j]%2 == 1) 46 { 47 cout<<i+1<<' '<<j+1<<endl ; 48 } 49 } 50 } 51 return 0 ; 52 }