POJ 2965&&1753
最近由于复习备考(然而考得还是很炸),很久没打题目了。现在开始刷寒假作业,不得不搞POJ
话说没有中文真的好烦啊!
先看1753
题目大意是说在一个4*4的格子中有黑白两色的棋子,你可以翻动其中的棋子但同时它四周(上下左右)的棋子也会被翻动,问你最少要翻几次才能翻成全黑或全白。
首先要想到,一个棋子翻转偶数次就相当于没翻,翻了奇数次就相当于翻了一次(很好想到),最重要的是它们翻转的顺序对答案并无影响!
所以一个棋子要么翻要么不翻,一共有2^(4*4)共65536种可能,直接爆搜即可。
注意一下翻棋子时不要越界
CODE
#include<cstdio> #include<iostream> using namespace std; const int fx[5]={0,1,0,-1,0},fy[5]={0,0,1,0,-1}; char a[5][5]; int i,j,ans=17; inline bool check() { int w=0,b=0; char comp=a[1][1]; for (int i=1;i<=4;++i) for (int j=1;j<=4;++j) if (a[i][j]!=comp) return 0; return 1; } inline void flip(int x,int y) { for (int i=0;i<5;++i) { int xx=x+fx[i],yy=y+fy[i]; if (xx<=0||yy<=0||xx>4||yy>4) continue; if (a[xx][yy]=='w') a[xx][yy]='b'; else a[xx][yy]='w'; } } inline void DFS(int x,int y,int s) { if (check()) { ans=s<ans?s:ans; return; } if (x>4) return; int xx=x,yy=y; if (++yy>4) ++xx,yy=1; flip(x,y); DFS(xx,yy,s+1); flip(x,y); DFS(xx,yy,s); } int main() { for (i=1;i<=4;++i) for (j=1;j<=4;++j) cin>>a[i][j]; DFS(1,1,0); if (ans!=17) printf("%d",ans); else puts("Impossible"); return 0; }
2965其实是一道基本相似的题目,也是在4*4的方格中把所有的开关都翻成‘-‘,每次翻一个就会使它所在的那一行和那一列都翻转。
同样的做法,不过是开一个vector纪录一下答案而已。
CODE
#include<cstdio> #include<iostream> #include<vector> using namespace std; vector <int> ans_x,ans_y; char a[5][5]; int i,j,ans=17; bool f[5][5]; inline void copy() { for (int i=1;i<=4;++i) for (int j=1;j<=4;++j) if (f[i][j]) ans_x.push_back(i),ans_y.push_back(j); } inline bool check() { int w=0,b=0; for (int i=1;i<=4;++i) for (int j=1;j<=4;++j) if (a[i][j]!='-') return 0; return 1; } inline void flip(int x,int y) { for (int i=1;i<=4;++i) if (a[i][y]=='-') a[i][y]='+'; else a[i][y]='-'; for (int j=1;j<=4;++j) if (a[x][j]=='-') a[x][j]='+'; else a[x][j]='-'; if (a[x][y]=='-') a[x][y]='+'; else a[x][y]='-'; } inline void DFS(int x,int y,int s) { if (check()) { if (s<ans) { ans=s; ans_x.clear(); ans_y.clear(); copy(); } return; } if (x>4) return; int xx=x,yy=y; if (++yy>4) ++xx,yy=1; flip(x,y); f[x][y]=1; DFS(xx,yy,s+1); flip(x,y); f[x][y]=0; DFS(xx,yy,s); } int main() { for (i=1;i<=4;++i) for (j=1;j<=4;++j) cin>>a[i][j]; DFS(1,1,0); printf("%d\n",ans); for (i=0;i<ans;++i) printf("%d %d\n",ans_x[i],ans_y[i]); return 0; }
辣鸡老年选手AFO在即