Poj_1970 The Game(五子棋模擬)

以前看過類似的五子棋題目,但都沒有親自去寫過。這道題目的輸出給了提示,可以先從左到右再從上到下掃,以每個非空格的格子作為起始點往右,下,右下(斜下),右上(斜上),然後判斷是否為連續5個的同色棋子,再另外判斷兩端是否相同,如果是6個連續的不算贏,以前不知道有5個以上是否能算贏!

    還有一個出現的問題就是x,y和i,j,我的一般程序中習慣i,j代表行(row)和列(column),但是x,y習慣表示橫坐標和縱坐標,即是先column後row,在right_up中,原來是 x=i+right_upX[u]; y=j+right_upY[u];是錯的。應該是x=i+right_upY[u];y=j+right_upX[u];

1970Accepted136K0MSC++3933B2014-07-14 00:00:12

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int board[30][30];
int right_downX[]={-1,1,2,3,4,5},right_downY[]={-1,1,2,3,4,5},rightY[]={0,0,0,0,0,0},rightX[]={-1,1,2,3,4,5},
downY[]={-1,1,2,3,4,5},downX[]={0,0,0,0,0,0},right_upX[]={-1,1,2,3,4,5},right_upY[]={1,-1,-2,-3,-4,-5};

int check_right(int i,int j)
{
   int x,y;
   int chess=board[i][j];
    for(int u=1;u<5;u++)
      {
         x=i+rightX[u];
         y=j+rightY[u];
         int k=board[x][y];
         if(!(x>0 && x<20 && y>0 && y<20 && chess==k))
           return 0;
      }
      x=i+rightX[0];
      y=j+rightY[0];
      if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
         return 0;
      x=i+rightX[5];
      y=j+rightY[5];
      if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
         return 0;
   return 1;
}
int check_down(int i,int j)
{
   int x,y;
   int chess=board[i][j];
    for(int u=1;u<5;u++)
      {
         x=i+downX[u];
         y=j+downY[u];
         int k=board[x][y];
         if(!(x>0 && x<20 && y>0 && y<20 && chess==k))
           return 0;
      }
      x=i+downX[0];
      y=j+downY[0];
      if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
         return 0;
      x=i+downX[5];
      y=j+downY[5];
      if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
         return 0;
   return 1;
}
int check_right_up(int i,int j)
{
   int x,y;
   int chess=board[i][j];
    for(int u=1;u<5;u++)
      {
         x=i+right_upY[u];
         y=j+right_upX[u];
         int k=board[x][y];
         if(!(x>0 && x<20 && y>0 && y<20 && chess==k))
           return 0;
      }
      x=i+right_upY[0];
      y=j+right_upX[0];
      if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
         return 0;
      x=i+right_upY[5];
      y=j+right_upX[5];
      if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
         return 0;
   return 1;
}
int check_right_down(int i,int j)
{
   int x,y;
   int chess=board[i][j];
    for(int u=1;u<5;u++)
      {
         x=i+right_downX[u];
         y=j+right_downY[u];
         int k=board[x][y];
         if(!(x>0 && x<20 && y>0 && y<20 && chess==k))
           return 0;
      }
      x=i+right_downX[0];
      y=j+right_downY[0];
      if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
         return 0;
      x=i+right_downX[5];
      y=j+right_downY[5];
      if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
         return 0;
   return 1;
}
int main()
{
   freopen("in.txt","r",stdin);
   int t,n,m,i,j;
   scanf("%d",&t);
   while(t--)
   {
      memset(board,0,sizeof(board));
      for(i=1;i<=19;i++)
         for(j=1;j<=19;j++)
            scanf("%d",&board[i][j]);
      int if_win=0;
      for(i=1;i<=19;i++)
         {for(j=1;j<=19;j++)
         {
            if(board[i][j]==0) continue;
            if_win=check_right(i,j);
            if(if_win)
               {
               printf("%d\n%d %d\n",board[i][j],i,j);
//               printf("A\n");
               break;
               }
            if_win=check_down(i,j);
            if(if_win)
               {
               printf("%d\n%d %d\n",board[i][j],i,j);
//                 printf("AA\n");
               break;
               }
               if_win=check_right_up(i,j);
            if(if_win)
               {
               printf("%d\n%d %d\n",board[i][j],i,j);
//               printf("AAA\n");
               break;
               }
               if_win=check_right_down(i,j);
            if(if_win)
               {
               printf("%d\n%d %d\n",board[i][j],i,j);
//               printf("AAAA\n");
               break;
               }
         }
         if(if_win==1) break;
         }
      if(if_win==0) printf("0\n");
//      printf("if_win=%d\n",if_win);
//      printf("t=%d\n",t);
   }
   return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值