UVa 220 - Othello
2014-10-31 21:15
274 查看
昨天上毛概Ac了UVa-201之后开始想的,又是上毛概时Ac的。今天程序老师有事,除了晚自习毛概,一整天没课。上午打了会代码,中午宿舍聚餐,下午睡了会起来就发现该上晚自习了。思路还是建数组,标记棋盘。代码写了很长,原本感觉运行时间也会很长,结果Run Time仅为0.009,应该是在代码中加了很多break和提前return的缘故。虽然没超时,但感觉代码实在太长了,以后写代码尽量优化结构,让代码短一点。WA了一次因为没考虑一次落子夹住多枚的情况。
#include<iostream> #include<algorithm> #include<cstring> #include<iomanip> #define maxn 10 using namespace std; char a[maxn][maxn],x; int n,w; char now,nex; void get_chessboard() { getchar(); memset(a,0,sizeof(a)); for(int i=0;i<8;i++) gets(a[i]); char c=getchar(); now='W'; nex='B'; if(c=='B') swap(now,nex); } int is_legal_judge(int i,int j,int u) { int z=0; if(a[i-1][j-1]==nex&&i-1>=0&&j-1>=0) { for(int k=2;i-k>=0&&j-k>=0;k++) { if(a[i-k][j-k]==nex) continue; else if(a[i-k][j-k]==now) { if(u) { for(int l=1;l<k;l++) a[i-l][j-l]=now; break; } return 1; } else break; } } if(a[i-1][j]==nex&&i-1>=0) { for(int k=2;i-k>=0;k++) { if(a[i-k][j]==nex) continue; else if(a[i-k][j]==now) { if(u) { for(int l=1;l<k;l++) a[i-l][j]=now; break; } return 1; } else break; } } if(a[i-1][j+1]==nex&&i-1>=0&&j+1<=8) { for(int k=2;i-k>=0&&j+k<=8;k++) { if(a[i-k][j+k]==nex) continue; else if(a[i-k][j+k]==now) { if(u) { for(int l=1;l<k;l++) a[i-l][j+l]=now; break; } return 1; } else break; } } if(a[i][j-1]==nex&&j-1>=0) { for(int k=2;j-k>=0;k++) { if(a[i][j-k]==nex) continue; else if(a[i][j-k]==now) { if(u) { for(int l=1;l<k;l++) a[i][j-l]=now; break; } return 1; } else break; } } if(a[i][j+1]==nex&&j+1<=8) { for(int k=2;j+k<=8;k++) { if(a[i][j+k]==nex) continue; else if(a[i][j+k]==now) { if(u) { for(int l=1;l<k;l++) a[i][j+l]=now; break; } return 1; } else break; } } if(a[i+1][j-1]==nex&&i+1<=8&&j-1>=0) { for(int k=2;i+k<=8&&j-k>=0;k++) { if(a[i+k][j-k]==nex) continue; else if(a[i+k][j-k]==now) { if(u) { for(int l=1;l<k;l++) a[i+l][j-l]=now; break; } return 1; } else break; } } if(a[i+1][j]==nex&&i+1<=8) { for(int k=2;i+k<=8;k++) { if(a[i+k][j]==nex) continue; else if(a[i+k][j]==now) { if(u) { for(int l=1;l<k;l++) a[i+l][j]=now; break; } return 1; } else break; } } if(a[i+1][j+1]==nex&&i+1<=8&&j+1<=8) { for(int k=2;i+k<=8&&j+k<=8;k++) { if(a[i+k][j+k]==nex) continue; else if(a[i+k][j+k]==now) { if(u) { for(int l=1;l<k;l++) a[i+l][j+l]=now; break; } return 1; } else break; } } return z; } int is_legal(int is_print) { int p=0,first=1; for(int i=0;i<8;i++) { for(int j=0;j<8;j++) { if(a[i][j]=='-') { if(is_legal_judge(i,j,0)) { if(is_print) { if(first) first=0; else cout<<" "; cout<<"("<<i+1<<","<<j+1<<")"; } p++; } } } } if(p&&is_print) cout<<endl; else if(!p&&is_print) cout<<"No legal move."<<endl; return p; } int cnt(char l) { int k=0; for(int i=0;i<8;i++) for(int j=0;j<8;j++) if(a[i][j]==l) k++; return k; } void M() { int y,z; cin>>y; z=y%10; y/=10; y--; z--; if(!is_legal(0)) swap(now,nex); is_legal_judge(y,z,1); a[y][z]=now; cout<<"Black - "<<setw(2)<<cnt('B')<<" White - "<<setw(2)<<cnt('W')<<endl; swap(now,nex); } void print_chessboard() { for(int i=0;i<8;i++) cout<<a[i]<<endl; } int main() { cin>>n; while(n--) { get_chessboard(); char c; while(cin>>c) { if(c=='L') is_legal(1); else if(c=='M') M(); else if(c=='Q') { print_chessboard(); break; } } if(n) cout<<endl; } return 0; }
相关文章推荐
- UVA - 220 Othello(黑白棋)
- 小紫书 4-3 UVA 220 Othello
- UVa-220 Othello
- Problem 046——UVa 220 - Othello
- UVa-220 Othello
- UVa 220 - Othello
- UVA220_Othello
- UVa 220 Othello
- UVa220 Othello 解题报告
- UVA - 220 Othello
- BFS:UVa220 ACM/ICPC 1992-Othello(黑白棋)
- UVA - 220 - Othello
- [刷题]算法竞赛入门经典(第2版) 4-3/UVa220 - Othello
- 算法竞赛入门经典(第2版)习题4-3 黑白棋 Othello UVa220
- UVA - 220 Othello
- UVA - 220 - Othello
- UVA 220 Othello——模拟
- Uva 220 Othello
- UVa220 算法竞赛入门经典(第2版)习题4-3 黑白棋 Othello
- 4-3 UVA 220 Othello 黑白棋