背景:写了一天,调了一天多,题意太容易曲解了!!!花了很多时间,但是让我在实战中明白了很多。终于ac了!!
学习:1.函数式的编程风格,是十分有益于调试的,也是十分有益于逻辑清晰的,在编程的时候注意逻辑清晰,结构明朗,往往会在调试阶段,省下很大的力。
3.棋盘类模拟题:代码简化方法就是用一个两行的二维数组来简化代码。
int list[2][8]={1,0,0,1,-1,0,0,-1,1,1,1,-1,-1,-1,-1,1} //八个方向都写出来是一种笨办法,而像这样写简化了很多代码。<span id="transmark"></span>
#include<stdio.h> #include<string.h> char map[8][9]; struct place{int x,y;}ans[100]; int judge(char current,char uncurrent){ int count=0; for(int i=0;i < 8;i++){ for(int j=0;j < 8;j++){ if(map[i][j] == '-'){ bool isY=true,is=false; for(int k=j+2;k < 8;k++){ if(j+1 < 8 && map[i][j+1] != uncurrent) isY=false; if(map[i][k] == uncurrent) continue; if(map[i][k] == current) {is=true;break;} isY=false; break; } if(isY && is){ ans[count].x=i+1; ans[count++].y=j+1; continue; } isY=true;is=false; for(int k=j-2;k >= 0;k--){ if(j-1 >= 0 && map[i][j-1] != uncurrent) isY=false; if(map[i][k] == uncurrent) continue; if(map[i][k] == current) {is=true;break;} isY=false; break; } if(isY && is){ ans[count].x=i+1; ans[count++].y=j+1; continue; } isY=true;is=false; for(int k=i-2;k >= 0;k--){ if(i-1 >= 0 && map[i-1][j] != uncurrent) isY=false; if(map[k][j] == uncurrent) continue; if(map[k][j] == current) {is=true;break;} isY=false; break; } if(isY && is){ ans[count].x=i+1; ans[count++].y=j+1; continue; } isY=true;is=false; for(int k=i+2;k < 8;k++){ if(i+1 < 8 && map[i+1][j] != uncurrent) isY=false; if(map[k][j] == uncurrent) continue; if(map[k][j] == current){is=true;break;} isY=false; break; } if(isY && is){ ans[count].x=i+1; ans[count++].y=j+1; continue; } isY=true;is=false; for(int k=i+2,kk=j+2;k < 8 && kk <8;kk++,k++){ if(i+1 < 8 && j+1 < 8 && map[i+1][j+1] != uncurrent) isY=false; if(map[k][kk] == uncurrent) continue; if(map[k][kk] == current) {is=true;break;} isY=false; break; } if(isY && is){ ans[count].x=i+1; ans[count++].y=j+1; continue; } isY=true;is=false; for(int k=i-2,kk=j-2;k >= 0 && kk >= 0;kk--,k--){ if(i-1 >= 0 && j-1 >= 0 && map[i-1][j-1] != uncurrent) isY=false; if(map[k][kk] == uncurrent) continue; if(map[k][kk] == current){is=true;break;} isY=false; break; } if(isY && is){ ans[count].x=i+1; ans[count++].y=j+1; continue; } isY=true;is=false; for(int k=i-2,kk=j+2;k >= 0 && kk < 8;kk++,k--){ if(i-1 >= 0 && j+1 < 8 && map[i-1][j+1] != uncurrent) isY=false; if(map[k][kk] == uncurrent) continue; if(map[k][kk] == current) {is=true;break;} isY=false; break; } if(isY && is){ ans[count].x=i+1; ans[count++].y=j+1; continue; } isY=true;is=false; for(int k=i+2,kk=j-2;k < 8 && kk >= 0;kk--,k++){ if(i+1 < 8 && j-1 >=0 && map[i+1][j-1] != uncurrent) isY=false; if(map[k][kk] == uncurrent) continue; if(map[k][kk] == current) {is=true;break;} isY=false; break; } if(isY && is){ ans[count].x=i+1; ans[count++].y=j+1; continue; } } } } return count; } void make(char current){ char uncurrent; l1:if(current == 'W') uncurrent='B'; else uncurrent='W'; char key; #ifdef LOCALS for(int kkk=0;kkk < 8;kkk++) printf("%s\n",map[kkk]); #endif scanf("%*c%c",&key); if(key == 'Q') { for(int kkk=0;kkk < 8;kkk++) printf("%s\n",map[kkk]); #ifdef LOCALS printf("Q have in\n"); #endif return;} else{ int count=judge(current,uncurrent); if(key == 'L'){ if(!count) printf("No legal move.\n"); else{ for(int iI=0;iI < count;iI++){ if(iI) printf(" "); printf("(%d,%d)",ans[iI].x,ans[iI].y); } printf("\n"); } }else{ char x1,y1; scanf("%c%c",&x1,&y1); int i=x1-'1',j=y1-'1'; bool haveone=false; for(int adf=0;adf < count;adf++){ if(i+1 == ans[adf].x && j+1 == ans[adf].y) haveone=true; } if(!haveone){ char jkl=current; current=uncurrent; uncurrent=jkl; } bool isY=true,is=false; for(int k=j+2;k < 8;k++){ if(j+1 < 8 && map[i][j+1] != uncurrent) isY=false; if(map[i][k] == uncurrent) continue; if(map[i][k] == current) {is=true;break;} isY=false; break; } if(isY && is){ for(int k=j+1;k < 8;k++){ if(map[i][k] == uncurrent) {map[i][k]=current;continue;} break; } } isY=true;is=false; for(int k=j-2;k >= 0;k--){ if(j-1 >= 0 && map[i][j-1] != uncurrent) isY=false; if(map[i][k] == uncurrent) continue; if(map[i][k] == current) {is=true;break;} isY=false; break; } if(isY && is){ for(int k=j-1;k > 0 ;k--){ if(map[i][k] == uncurrent) {map[i][k]=current;continue;} break; } } isY=true;is=false; for(int k=i-2;k >= 0;k--){ if(i-1 >= 0 && map[i-1][j] != uncurrent) isY=false; if(map[k][j] == uncurrent) continue; if(map[k][j] == current) {is=true;break;} isY=false; break; } if(isY && is){ for(int k=i-1;k > 0 ;k--){ if(map[k][j] == uncurrent){map[k][j]=current;continue;} break; } } isY=true;is=false; for(int k=i+2;k < 8;k++){ if(i+1 < 8 && map[i+1][j] != uncurrent) isY=false; if(map[k][j] == uncurrent) continue; if(map[k][j] == current) {is=true;break;} isY=false; break; } if(isY && is){ for(int k=i+1;k < 8;k++){ if(map[k][j] == uncurrent) {map[k][j]=current;continue;} break; } } isY=true;is=false; for(int k=i+2,kk=j+2;k < 8 && kk <8;kk++,k++){ if(i+1 < 8 && j+1 < 8 && map[i+1][j+1] != uncurrent) isY=false; if(map[k][kk] == uncurrent) continue; if(map[k][kk] == current){is=true;break;} isY=false; break; } if(isY && is){ for(int k=i+1,kk=j+1;k < 8 && kk <8;kk++,k++){ if(map[k][kk] == uncurrent){map[k][kk]=current;continue;} break; } } isY=true;is=false; for(int k=i-2,kk=j-2;k >= 0 && kk >= 0;kk--,k--){ if(i-1 >= 0 && j-1 >= 0 && map[i-1][j-1] != uncurrent) isY=false; if(map[k][kk] == uncurrent) continue; if(map[k][kk] == current) {is=true;break;} isY=false; break; } if(isY && is){ for(int k=i-1,kk=j-1;k >= 0 && kk >= 0;kk--,k--){ if(map[k][kk] == uncurrent){map[k][kk]=current;continue;} break; } } isY=true;is=false; for(int k=i-2,kk=j+2;k >= 0 && kk < 8;kk++,k--){ if(i-1 >= 0 && j+1 < 8 && map[i-1][j+1] != uncurrent) isY=false; if(map[k][kk] == uncurrent) continue; if(map[k][kk] == current) {is=true;break;} isY=false; break; } if(isY && is){ for(int k=i-1,kk=j+1;k >= 0 && kk < 8;kk++,k--){ if(map[k][kk] == uncurrent) {map[k][kk]=current;continue;} break; } } isY=true;is=false; for(int k=i+2,kk=j-2;k < 8 && kk >= 0;kk--,k++){ if(i+1 < 8 && j-1 >= 0 && map[i+1][j-1] != uncurrent) isY=false; if(map[k][kk] == uncurrent) continue; if(map[k][kk] == current) {is=true;break;} isY=false; break; } if(isY && is){ for(int k=i+1,kk=j-1;k < 8 && kk >= 0;kk--,k++){ if(map[k][kk] == uncurrent) {map[k][kk]=current;continue;} break; } } map[i][j]=current; int bn=0,wn=0; for(i=0;i < 8;i++){ for(j=0;j < 8;j++){ if(map[i][j] == 'B') bn++; else if(map[i][j] == 'W') wn++; } } printf("Black - %2d White - %2d\n",bn,wn); current=uncurrent; #ifdef LOCALS for(int kkk=0;kkk < 8;kkk++) printf("%s\n",map[kkk]); printf("\n****\n测试完下棋之后数据专用\n\n"); #endif }goto l1; } } int main(void){ #ifdef LOCAL freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int t; scanf("%d",&t); for(int jxj=0;jxj < t;jxj++){ if(jxj) printf("\n"); char current; for(int i=0;i < 8;i++) scanf("%s",map[i]); scanf("%*c%c",¤t); make(current); } return 0; }