UVa220 算法竞赛入门经典(第2版)习题4-3 黑白棋 Othello

来源:互联网 发布:魔法盾软件 编辑:程序博客网 时间:2024/05/16 05:43

 老规则   题目解释看他们的  代码看我的。。

        可能我的代码略微浓缩一些。  。。

。。我找了半天,,代码写的都好长。,要是看懂了题目的话 就看我的代码吧。

http://blog.csdn.net/kyoma/article/details/51824912

 要是看不懂代码的话  可以先看下面这个  然后回头再看我这个自己乱搞的。。。

http://bbs.csdn.net/topics/391995414

 主要是 实现重复的过程  函数的多次利用。


//current 记录的当前的颜色 W or B。  从主函数开始看 我有引导。

   #include<stdio.h>
char board[10][10];
char current;
int chuli(int x,int y,int stepx,int stepy){
     int i=0;
     while (1) {
        i++;
        x += stepx;
        y += stepy;
        if (x<1 || x>9 || y<1 || y>9) break; //貌似是没用的废话,习惯了。。加上边界。
        if (board[x][y]==current && i!=1) return 1; // 如果走了一步就出现一样的 说明两个一样的挨着 非法。
        if (board[x][y]!=current && board[x][y]!='-') continue;
          else  break;
     }
    return 0;
}  // 一步一步的走啊 直到出现curren一样的停止     回到main吧
int bracketed(int x,int y){
     for (int i=-1;i<=1;i++)
       for (int j=-1;j<=1;j++){
            if (i==0 && j==0) continue;
            if (chuli(x,y,i,j)) return 1;
       }  //这里脑洞有点大在当前点有8个 方向需要判断 任何一个成立 都是合法位置。  转到chuli(处理 函数)


     return 0;
  }
void change(int x,int y,int stepx,int stepy){
      board[x][y] = current;
      while (1) {
         x+=stepx;
         y+=stepy;
         if (board[x][y]==current) break;
         if (current=='B') board[x][y]='B';
             else board[x][y]='W';
      }
  } 看懂了chuli 函数 这个没啥区别 只不过改变一下好了  道理比 chuli函数还简单。chuli就是判断一下 这个就翻转一下。 回main吧
int main(){
   int T,first=1;
   scanf("%d\n",&T);
   while (T--) {
      first?first=0:putchar(10);
      for (int i=1;i<=8;i++)
         for (int j=1;j<=8;j++)
      if (j==8) {
         scanf("%c",&board[i][j]);
         getchar();
      } else scanf("%c",&board[i][j]);
      scanf("%c\n",&current);
      char ch;
      while (scanf("%c\n",&ch)){
        if (ch=='Q') {
            for (int i=1;i<=8;i++)
                for (int j=1;j<=8;j++)
                 if (j==8) printf("%c\n",board[i][j]);
            else printf("%c",board[i][j]);
            break;
        }     // 输出结果 不解释了吧。
        if (ch=='L'){
            int ff=1;
            for (int i=1;i<=8;i++)
                for (int j=1;j<=8;j++)
                    if (board[i][j]=='-' && bracketed(i,j)) {//  bracked 函数来判断这个位置是否合法位置 转到上面的函数继续分析。
                ff?ff=0:putchar(' ');
                printf("(%d,%d)",i,j);
            }
            ff?printf("No legal move.\n"):putchar(10);
        }   
        if (ch=='M') {
                 int x,y;
                scanf("%1d%1d",&x,&y);  //  读入数字 一个位置一个位置的读入啊 两个10以内的数字 之间没有空格。
                if (!bracketed(x,y))   // 巧妙借用上一个函数,判断是否可以放  不可的话 换下棋的一方。
                     if (current=='W') current = 'B';else current='W';
           for (int i=-1;i<=1;i++)
             for (int j=-1;j<=1;j++)
               if (i==0 && j==0) continue;
               else if (chuli(x,y,i,j)) change(x,y,i,j);  //  换过以后就可以了啊。 再次用这个chuli函数。老样子 8个方向来找 看哪个方向可以 就去change棋盘。 转到change


            if (current=='W') current = 'B';else current='W';
            int black=0,white=0;
            for (int i=1;i<=9;i++)
             for (int j=1;j<=9;j++){
                 if (board[i][j]=='B') black++;
                 if (board[i][j]=='W') white++;
             }
            printf("Black - %2d White - %2d\n",black,white);  // 最后了  TM大坑啊。。两位宽度。。。。。
        }
      }
 }
}

0 0