1. 程式人生 > >習題4-3 黑白棋 UVa220

習題4-3 黑白棋 UVa220

#include <stdio.h>
#include <string.h>

const int maxn=10;
char board[maxn][maxn];//棋盤資訊
int legal[maxn][maxn]; //落子合法位置
int direction[maxn];//八個方向,"米"字形,重左橫開始,順時針方向。
void printdirection(){
    int i;
    for(i=1;i<=8;i++)
        printf("%d ",direction[i]);
    printf("\n");
}
void printlist(){//列印可能位置
    int i,j;
    int count=0;
    
    for(i=1;i<=8;i++){
        for(j=1;j<=8;j++){
            if(legal[i][j]==1){
                count++;
                if(count==1)
                    printf("(%d,%d)",i,j);
                else//列印有效點的時候每個點之間都有空格,但是最後一個點後面不能有,果斷修改,
                    printf(" (%d,%d)",i,j);
            }
        }
    }
    if(count==0)
        printf("No legal move.");
    printf("\n");
}
void list(char c,int row,int col){//列舉當前棋子的合法位置
    char other;
    int i,j;
    
    if(c=='B')//確定當前棋子,與對手棋子
        other='W';
    else
        other='B';
    //“米”字形,八個方位,左橫、上豎、右橫、下豎、左上斜、右上斜、左下斜、右下斜
    // 左橫
    i=row;
    j=col;
    while(j-1>=1&&board[i][j-1]==other)//趟過other棋子,有快速排序程式碼的一點痕跡
        j--;
    if(j!=col&&j-1>=1&&board[i][j-1]=='-'){
        j--;
        legal[i][j]=1;
    }
    //右橫
    i=row;
    j=col;
    while(j+1<=8&&board[i][j+1]==other)//趟過other棋子
        j++;
    if(j!=col&&j+1<=8&&board[i][j+1]=='-'){
        j++;
        legal[i][j]=1;
    }
    //上豎
    i=row;
    j=col;
    while(i-1>=1&&board[i-1][j]==other)//趟過other棋子
        i--;
    if(i!=row&&i-1>=1&&board[i-1][j]=='-'){
        i--;
        legal[i][j]=1;
    }
    //下豎
    i=row;
    j=col;
    while(i+1>=1&&board[i+1][j]==other)//趟過other棋子
        i++;
    if(i!=row&&i+1<=8&&board[i+1][j]=='-'){
        i++;
        legal[i][j]=1;
    }
    //左上斜
    i=row;
    j=col;
    while(i-1>=1&&j-1>=1&&board[i-1][j-1]==other){//趟過other棋子
        i--;
        j--;
    }
    if(i!=row&&j!=col&&i-1>=1&&j-1>=1&&board[i-1][j-1]=='-'){
        i--;
        j--;
        legal[i][j]=1;
    }
    //右下斜
    i=row;
    j=col;
    while(i+1<=8&&j+1<=8&&board[i+1][j+1]==other){//趟過other棋子
        i++;
        j++;
    }
    if(i!=row&&j!=col&&i+1<=8&&j+1<=8&&board[i+1][j+1]=='-'){
        i++;
        j++;
        legal[i][j]=1;
    }
    //右上斜
    i=row;
    j=col;
    while(i-1>=1&&j+1<=8&&board[i-1][j+1]==other){
        i--;
        j++;
    }
    if(i!=row&&j!=col&&i-1>=1&&j+1<=8&&board[i-1][j+1]=='-'){
        i--;
        j++;
        legal[i][j]=1;
    }
    //左下斜
    i=row;
    j=col;
    while(i+1<=8&&j-1>=1&&board[i+1][j-1]==other){
        i++;
        j--;
    }
    if(i!=row&&j!=col&&i+1<=8&&j-1>=1&&board[i+1][j-1]=='-'){
        i++;
        j--;
        legal[i][j]=1;
    }
}

void enumdirection(char c,int row,int col){//列舉列舉落子的作用範圍
    char other;
    int i,j;
    memset(direction,0,sizeof(direction));//初始化方向
    if(c=='B')//確定當前棋子,與對手棋子
        other='W';
    else
        other='B';
    //“米”字形,八個方位,左橫、上豎、右橫、下豎、左上斜、右上斜、左下斜、右下斜
    // 左橫 米 direction[1];
    i=row;
    j=col;
    while(j-1>=1&&board[i][j-1]==other)//趟過other棋子,有快速排序程式碼的一點痕跡
        j--;
    if(j!=col&&j-1>=1&&board[i][j-1]==c){
        j--;
        direction[1]=1;
    }
    //右橫 米 dirction[5]
    i=row;
    j=col;
    while(j+1<=8&&board[i][j+1]==other)//趟過other棋子
        j++;
    if(j!=col&&j+1<=8&&board[i][j+1]==c){
        j++;
        direction[5]=1;
    }
    //上豎 米 dirction[3]
    i=row;
    j=col;
    while(i-1>=1&&board[i-1][j]==other)//趟過other棋子
        i--;
    if(i!=row&&i-1>=1&&board[i-1][j]==c){
        i--;
        direction[3]=1;
    }
    //下豎 米 dirction[7]
    i=row;
    j=col;
    while(i+1>=1&&board[i+1][j]==other)//趟過other棋子
        i++;
    if(i!=row&&i+1<=8&&board[i+1][j]==c){
        i++;
        direction[7]=1;
    }
    //左上斜 米 direction[2]
    i=row;
    j=col;
    while(i-1>=1&&j-1>=1&&board[i-1][j-1]==other){//趟過other棋子
        i--;
        j--;
    }
    if(i!=row&&j!=col&&i-1>=1&&j-1>=1&&board[i-1][j-1]==c){
        i--;
        j--;
        direction[2]=1;
    }
    //右下斜 米 direction[6]
    i=row;
    j=col;
    while(i+1<=8&&j+1<=8&&board[i+1][j+1]==other){//趟過other棋子
        i++;
        j++;
    }
    if(i!=row&&j!=col&&i+1<=8&&j+1<=8&&board[i+1][j+1]==c){
        i++;
        j++;
        direction[6]=1;
    }
    //右上斜 米 direction[4]
    i=row;
    j=col;
    while(i-1>=1&&j+1<=8&&board[i-1][j+1]==other){
        i--;
        j++;
    }
    if(i!=row&&j!=col&&i-1>=1&&j+1<=8&&board[i-1][j+1]==c){
        i--;
        j++;
        direction[4]=1;
    }
    //左下斜 米 direction[8]
    i=row;
    j=col;
    while(i+1<=8&&j-1>=1&&board[i+1][j-1]==other){
        i++;
        j--;
    }
    if(i!=row&&j!=col&&i+1<=8&&j-1>=1&&board[i+1][j-1]==c){
        i++;
        j--;
        direction[8]=1;
    }
}

void setboard(char c,int row,int col){//根據落子佈局棋盤
    
    char other;
    int i,j;

    if(c=='B')//確定當前棋子,與對手棋子
        other='W';
    else
        other='B';
    
    board[row][col]=c;//安放落子
    //“米”字形,八個方位,左橫、上豎、右橫、下豎、左上斜、右上斜、左下斜、右下斜
    // 左橫 米 direction[1];
    if(direction[1]==1){
        i=row;
        j=col;
        while(j-1>=1&&board[i][j-1]==other){//趟過other棋子,有快速排序程式碼的一點痕跡
            j--;
            board[i][j]=c;
        }
        if(j!=col&&j-1>=1&&board[i][j-1]==c){
            j--;
        }
    }
    
    //右橫 米 dirction[5]
    if(direction[5]==1){
        i=row;
        j=col;
        while(j+1<=8&&board[i][j+1]==other){//趟過other棋子
            j++;
            board[i][j]=c;
        }
        if(j!=col&&j+1<=8&&board[i][j+1]==c){
            j++;
        }
    }
     
    //上豎 米 dirction[3]
    if(direction[3]==1){
        i=row;
        j=col;
        while(i-1>=1&&board[i-1][j]==other){//趟過other棋子
            i--;
            board[i][j]=c;
        }
        if(i!=row&&i-1>=1&&board[i-1][j]==c){
            i--;
        }
    }
    
    //下豎 米 dirction[7]
    if(direction[7]==1){
        i=row;
        j=col;
        while(i+1>=1&&board[i+1][j]==other){//趟過other棋子
            i++;
            board[i][j]=c;
        }
        if(i!=row&&i+1<=8&&board[i+1][j]==c){
            i++;
        }
    }
    
    //左上斜 米 direction[2]
    if(direction[2]==1){
        i=row;
        j=col;
        while(i-1>=1&&j-1>=1&&board[i-1][j-1]==other){//趟過other棋子
            i--;
            j--;
            board[i][j]=c;
        }
        if(i!=row&&j!=col&&i-1>=1&&j-1>=1&&board[i-1][j-1]==c){
            i--;
            j--;
        }
    }
    
    //右下斜 米 direction[6]
    if(direction[6]==1){
        i=row;
        j=col;
        while(i+1<=8&&j+1<=8&&board[i+1][j+1]==other){//趟過other棋子
            i++;
            j++;
            board[i][j]=c;
        }
        if(i!=row&&j!=col&&i+1<=8&&j+1<=8&&board[i+1][j+1]==c){
            i++;
            j++;
        }
    }
    
    //右上斜 米 direction[4]
    if(direction[4]==1){
        i=row;
        j=col;
        while(i-1>=1&&j+1<=8&&board[i-1][j+1]==other){
            i--;
            j++;
            board[i][j]=c;
        }
        if(i!=row&&j!=col&&i-1>=1&&j+1<=8&&board[i-1][j+1]==c){
            i--;
            j++;
        }
    }
    
    //左下斜 米 direction[8]
    if(direction[8]==1){
        i=row;
        j=col;
        while(i+1<=8&&j-1>=1&&board[i+1][j-1]==other){
            i++;
            j--;
            board[i][j]=c;
        }
        if(i!=row&&j!=col&&i+1<=8&&j-1>=1&&board[i+1][j-1]==c){
            i++;
            j--;
        }
    }
    
}

void countboard(){
    int i,j;
    int Bcount=0,Wcount=0;
    for(i=1;i<=8;i++){
        for(j=1;j<=8;j++){
            if(board[i][j]=='B')
                Bcount++;
            if(board[i][j]=='W')
                Wcount++;
        }
    }
    printf("Black - %2d White - %2d\n",Bcount,Wcount);
}
void setlegal(char player){//設定當前顏色棋子可行區域
    int i,j;
    memset(legal,0,sizeof(legal));//初始化合法區域,設定為0
    for(i=1;i<=8;i++){//掃描字元為player的棋子
        for(j=1;j<=8;j++){
            if(board[i][j]==player)
                list(player,i,j);
        }
    }
}

void printboard(){
    int i,j;
    for(i=1;i<=8;i++){
        for(j=1;j<=8;j++){
            printf("%c",board[i][j]);
        }
        printf("\n");
    }
}
int main(){
    int T;
    char line[10];
    int i,j;
    int row,col;
    int blank=0;
    char s[10];
    char player;
    scanf("%d",&T);
    while(T--){//事例次數
        if(blank>0)//列印例子間空行
            printf("\n");
        blank++;
        memset(board,0,sizeof(board));
        for(i=1;i<=8;i++){//讀取棋盤資訊
            scanf("%s",line);
            for(j=1;j<=8;j++){
                board[i][j]=line[j-1];
            }
        }
        scanf("%s",s);//讀取當前落子顏色
        player=s[0];
        while(1){    
            scanf("%s",s);//讀取當前棋盤操作
            if(s[0]=='L'){
                setlegal(player);
                printlist();//列印可能位置
            }else if(s[0]=='M'){//每次移動後,需要增加board資料,需要重設legal值
                row=s[1]-'0';
                col=s[2]-'0';
                setlegal(player);//每次移動前,總要先查詢合法放置區域,該句漏了,整整查了兩天11.3-11.4,終於AC了,想到都是淚
                if(legal[row][col]==1){//合法放置
                    enumdirection(player,row,col);//列舉可能放置方向
                    setboard(player,row,col);//根據落子,重新佈局棋盤
                    countboard();//統計棋盤黑白棋個數
                }else{//非法放置,另一種顏色棋子先走,從題意看,另一種顏色棋子一定能走成功
                    player=player=='B'?'W':'B';//改變當前落子顏色,第一次用三目運算子
                    setlegal(player);
                    enumdirection(player,row,col);//列舉可能放置方向
                    setboard(player,row,col);//根據落子,重新佈局棋盤
                    countboard();//統計棋盤黑白棋個數
                }
                //每次移動後,先手自動交換顏色
                player=player=='B'?'W':'B';
            }else if(s[0]=='Q'){//退出當前事例
                printboard();
                break;
            }
        }
    }
    return 0;
}


相關推薦

習題4-3 白棋 UVa220

#include <stdio.h> #include <string.h> const int maxn=10; char board[maxn][maxn];//棋盤資訊 int legal[maxn][maxn]; //落子合法位置 int direction[maxn];/

演算法競賽入門經典(第2版)習題4-3 白棋 Othello UVa220

這題邏輯和習題4-1象棋很相似,沒什麼特別的。 第一次提交報wa,添加了若干樣例測試,發現邏輯無誤。 與樣例輸出對拍後發現輸出尾部多了一個換行符,修改後ac。 //#define LOCAL //#define TESTING #include<stdio.h>

UVa220 演算法競賽入門經典(第2版)習題4-3 白棋 Othello

 老規則   題目解釋看他們的  程式碼看我的。。         可能我的程式碼略微濃縮一些。  。。 。。我找了半天,,程式碼寫的都好長。,要是看懂了題目的話 就看我的程式碼吧。 http://blog.csdn.net/kyoma/article/details/51

Uva 220 Othello 白棋習題4-3

做完這道加上前面兩道,這一章果然都是呼叫函式的。。。 自己寫一堆函式來搞 寫的過程中甚至覺得自己可以考慮寫一個黑白棋的遊戲了233 主要還是一個模擬 其實做了象棋那題的話會發現和象棋那題差不多,也是一堆函式堆出來的 象棋那題有一個思路就是需要對不同棋子也不同的函

python實現西瓜書《機器學習》習題4.3資訊增益決策樹

首先這篇的格式可能會亂,markdown裝上以後,有時候是用csdn原來的編輯器,有時候就變成了markdown編輯器,蒙。 更蒙的是,大牛的程式碼太飄逸了,有點看不懂,慣例先來原地址:https://blog.csdn.net/Snoopy_Yuan/article/details/689

西瓜書 課後習題4.3 基於資訊熵決策樹,連續和離散屬性,並驗證模型

import matplotlib.pyplot as plt import numpy as np from math import log import operator import csv def readDataset(filename): ''' 讀取資料 :

浙大版《資料結構》習題4.3 是否二叉搜尋樹 (25 分)

本題要求實現函式,判斷給定二叉樹是否二叉搜尋樹。 函式介面定義: bool IsBST ( BinTree T ); 其中BinTree結構定義如下: typedef struct TNode *Position; typedef Position BinT

西瓜書習題4.3 基於資訊熵決策樹,連續和離散屬性

from math import log import operator import csv def readDataset(filename): ''' 讀取資料 :param filename: 資料檔名,CSV格式 :return:

周志華《機器學習》習題4.3

為表4.3中資料生成一棵決策樹。 程式碼是在《機器學習實戰》的程式碼基礎上改良的,借用了numpy, pandas之後明顯簡化了程式碼。表4.3的資料特徵是離散屬性和連續屬性都有,問題就複雜在這裡。話不多說,看程式碼。 先定義幾個輔助函式,正常的思路是先想巨

4.白棋UVA220

黑白棋(UVA220) 題目簡單分析 程式碼 題目簡單分析 題目的詳細內容可以在這個網站上看到,下面簡單說明一下題目要求。 [題意] 本題主要任務是模擬黑白棋的過程,黑白棋的規則是一方用自己的棋子夾住對方的棋子,然後就可以把夾住的棋子“吃掉”

習題4 編寫一個方法method(),判斷一個數能否同時被3和5整除

true ati rgs 同時 [] 返回 運算符 pri void 編寫一個方法method(),判斷一個數能否同時被3和5整除 首先編寫一個方法method(),由於是判斷,所以返回的數據類型應是波爾型,並且向主方法傳一個整數類型的參數X public class Z

雙向連結串列的構造(演算法4習題1.3.31)

  原題:實現一個巢狀類DoubleNode用來構造雙向連結串列,其中每個節點都含有一個指向前驅元素的引用和一個指向後續元素的引用(如果不存在則為NULL)。為以下任務實現若干靜態方法:在表頭插入結點、在表尾插入結點、在表頭刪除結點、在表尾刪除結點、在指定結點之前插入新結點、在指定結點之後插入新結點、刪除指定

演算法-藍橋杯習題4-3

藍橋杯習題 藍橋杯練習系統習題加答案,總共分為6部分,90%習題使用C語言解答,部分使用C++或者Java。大部分習題為搜尋參考或者別人提供所得,不足之處在所難免,懇請批評指正(預計200多題,習題僅供學習交流) 目錄 藍橋杯練習系統評測

習題 4.9 給一個不多於5位的正整數,要求:1. 求出它是幾位數;2. 分別輸出每一位數字;3. 按逆序輸出各位數字,例如原數為321,應輸出123。

C程式設計 (第四版) 譚浩強 習題4.9 個人設計 習題 4.9 給一個不多於5位的正整數,要求: 1. 求出它是幾位數; 2. 分別輸出每一位數字; 3. 按逆序輸出各位數字,例如原數為321,應輸出123。 程式碼塊:

演算法-藍橋杯習題3-4

藍橋杯習題 藍橋杯練習系統習題加答案,總共分為6部分,90%習題使用C語言解答,部分使用C++或者Java。大部分習題為搜尋參考或者別人提供所得,不足之處在所難免,懇請批評指正(預計200多題,習題僅供學習交流) 目錄 藍橋杯練習系統評測

Eclipse Kepler(4.3)安裝jad反編譯插件

index.php height features eclispe general 一個 版本 java_home pat 1.下載jad,地址:http://varaneckas.com/jad/(根據自己的系統選擇一個下載) 2.下載jad插件,地址:http://ja

Mac 下解決虛擬機virtualbox 4.3和windows共享問題

jsb windows安裝 mman 重新啟動 con 安裝ad clas 啟動 sdn mac上面安裝了最新的virtualbox,有些軟件還是須要windows的。 1,在設置了共享之後,仍然不能使用 不能共享 2,找了半天發現須要windows安裝 VB

httpclient新舊版本分割點4.3

redirect xtra xpl 包括 execute syntax target exec cli 從這個版本開始,httpclient的api發生了一次重大調整。主要包括如下:Release 4.3 Final ------------------- This is

4.3 命名空間和程序集

image dll com alt 指示 str 名稱 bject http 命名空間對相關的類型進行邏輯分組。 C# using 指令指示編譯器嘗試為類型名稱附加不同的前綴,直至找到匹配項。 CLR 對命名空間一無所知。訪問類型時,CLR需要知道類型的完整名稱以及類型定

4.3 Building a Datapath-Computer Organization and Design筆記

字節 res 地址 計算機硬件 set 流動 off word counter MIPS下的數據路徑 這是計算機硬件間的數據路徑(即數據流動的路徑),下面將較詳細分析此圖: PC(program counter, 程序計數器)是一個用於記錄當前計算機正在執行的指