HDU 3683 類比&搜尋

來源:互聯網
上載者:User

標籤:io   os   for   on   amp   size   as   hdu   return   

給出五子棋殘局,判斷三步內是否能分出勝負,玩家為當前該走旗子的顏色,下一步為白棋或黑棋不定。

按照順序判斷即可:

1:判斷棋盤是否合法,並確定玩家顏色

2:判斷當前玩家顏色是否有一個必勝點,有玩家則在第一步勝

3:判斷另一方在當前是否有兩個必勝點,若有,則玩家在第二步失敗

4:BFS出玩家是否存在此方案:任意放置一個位置的前提下,另一方沒有必勝點,且玩家有兩個必勝點,則玩家在第三步勝

5:否則3步內無法分出勝負


#include "stdio.h"#include "string.h"int dir[4][2]={{-1,0},{-1,1},{0,1},{1,1}};int map[21][21];int ans_x,ans_y;int ok1(int key){    int i,j,x,y,k,sum;    for (i=0;i<15;i++)        for (j=0;j<15;j++)        if (map[i][j]==-1)        {            for (k=0;k<4;k++)            {                x=i; y=j; sum=1;                while (1)                {                    x+=dir[k][0];                    y+=dir[k][1];                    if (x<0 || x>=15 || y<0 || y>=15) break;                    if (map[x][y]!=key) break;                    sum++;                }                x=i;y=j;                while (1)                {                    x-=dir[k][0];                    y-=dir[k][1];                    if (x<0 || x>=15 || y<0 || y>=15) break;                    if (map[x][y]!=key) break;                    sum++;                }                if (sum>=5) { ans_x=i; ans_y=j; return 1;}            }        }    return -1;}int ok2(int key){    int i,j,k,x,y,sum,ok;    ok=0;    for (i=0;i<=14;i++)        for (j=0;j<=14;j++)        if (map[i][j]==-1)        {            for (k=0;k<4;k++)            {                sum=1;                x=i; y=j;                while (1)                {                    x+=dir[k][0];                    y+=dir[k][1];                    if (x<0 || x>=15 || y<0 || y>=15) break;                    if (map[x][y]!=key) break;                    sum++;                }                x=i; y=j;                while (1)                {                    x-=dir[k][0];                    y-=dir[k][1];                    if (x<0 || x>=15 || y<0 || y>=15) break;                    if (map[x][y]!=key) break;                    sum++;                }                if (sum>=5) {ok++;break;}            }            if (ok==2) return 1;        }        return -1;}int bfs(int key){    int i,j;    for (i=0;i<15;i++)        for (j=0;j<15;j++)        if (map[i][j]==-1)        {            map[i][j]=key;            if (ok1(1-key)==-1 && ok2(key)==1)            {            ans_x=i; ans_y=j;            return 1;            }            map[i][j]=-1;        }    return -1;}int main(){    int n,i,a,b,c,blk,wt,first,ans;    while (scanf("%d",&n)!=EOF)    {        if (n==0) break;        blk=wt=0;        memset(map,-1,sizeof(map));        for (i=1;i<=n;i++)        {            scanf("%d%d%d",&a,&b,&c);            map[a][b]=c;            if (c==1) blk++; else wt++;        }        if (blk==wt) first=1;        else            if (blk==wt+1) first=0;        else        {            printf("Invalid.\n");            continue;        }        ans=ok1(first); // 第一步存在必勝點        if (ans==1)        {            printf("Place ");            if (first==1) printf("black "); else printf("white ");            printf("at (%d,%d) to win in 1 move.\n",ans_x,ans_y);            continue;        }        ans=ok2(1-first); // 另一方存在兩個必勝點        if (ans==1)        {            printf("Lose in 2 moves.\n");            continue;        }        ans=bfs(first); // 搜尋是否存在第三步定勝負        if (ans==1)        {            printf("Place ");            if (first==1) printf("black "); else printf("white ");            printf("at (%d,%d) to win in 3 moves.\n",ans_x,ans_y);            continue;        }        else            printf("Cannot win in 3 moves.\n");    }    return 0;}


HDU 3683 類比&搜尋

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.