现在的位置: 首页 > 综合 > 正文

UVa 220

2018年04月23日 ⁄ 综合 ⁄ 共 10429字 ⁄ 字号 评论关闭

背景:写了一天,调了一天多,题意太容易曲解了!!!花了很多时间,但是让我在实战中明白了很多。终于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",&current);
        make(current);
    }
    return 0;
}


【上篇】
【下篇】

抱歉!评论已关闭.