UVA 220 Othello

题意:输入n,代表次数,每次输入8*8的棋盘,处理3种命令:①L:打印所有合法操作,②M:放棋子,③Q:打印棋盘然后退出。

思路:①用字符数组存棋盘,整型数组存合法位置。

②查找的方法:当前玩家为cur,遍历棋盘,发现棋子颜色为cur,就从此位置,向8个方向查找,查找到有back(对手),就置flag为1,

继续查找,查找到'-',即为合法位置,记录此位置,换方向查找。

③放棋子:和查找思路类似,修改放下的棋子后,从此位置向8个方向查找,查找到cur,cntBack++,继续查找,查找到有back,置flag为1,

只有flag=1且cntBack!=0,才代表可以修改其中的back,满足则循环修改。

  1 #include "stdio.h"
  2 #include "string.h"
  3 #include "stdlib.h"
  4 #define FIN freopen("input.txt","r",stdin)
  5 #define FOUT     freopen("output.txt","w",stdout)
  6 char board[9][9],cur,cmd,back;
  7 int legal[9][9],hasLegal,numb,numw;
  8 int n;
  9 void find()//查找合法位置
 10 {
 11     int count=0,count2=0;
 12     hasLegal=1;
 13     memset(legal,0,sizeof(legal));
 14 //    curnum=backnum=0;
 15     for(int i=0;i<8;i++)
 16     {
 17         for(int j=0;j<8;j++)
 18         {
 19             if(board[i][j]==cur)
 20             {
 21                 int next[8][2]={{0,1},{1,0},{0,-1},{-1,0},{-1,1},{1,1},{1,-1},{-1,-1}};//右,下,左,上,右上,右下,左下,左上
 22                 int nextx=i,nexty=j;
 23 //                printf("1(%d,%d)\n",nextx+1,nexty+1);
 24                 for(int k=0;k<8;k++,nextx=i,nexty=j)
 25                 {
 26                     int flag=0;
 27                     nextx+=next[k][0];
 28                     nexty+=next[k][1];
 29 //                    printf("k=%d 2(%d,%d)\n",k,nextx+1,nexty+1);
 30                     if(nextx>7||nextx<0||nexty>7||nexty<0)
 31                         continue;
 32 //                    printf("(%d,%d)=%c back=%c\n",nextx,nexty,board[nextx][nexty],back);
 33                     if(board[nextx][nexty]==back)
 34                         {
 35                             flag=1;
 36 //                            printf("flag=1\n");
 37                         }
 38                     while(flag&&board[nextx][nexty]!=cur)
 39                     {
 40                         nextx+=next[k][0];
 41                         nexty+=next[k][1];
 42 //                        printf("3(%d,%d)=1\n",nextx+1,nexty+1);
 43                         if(nextx>7||nextx<0||nexty>7||nexty<0)
 44                             break;
 45                         if(board[nextx][nexty]=='-')
 46                         {
 47                             legal[nextx][nexty]=1;
 48 //                            printf("real(%d,%d)=1\n",nextx+1,nexty+1);
 49                             count++;
 50                             break;
 51                         }
 52                     }
 53                 }
 54             }
 55         }
 56     }
 57     if(count!=0)
 58     {
 59         for(int i=0;i<=7;i++)
 60         {
 61             for(int j=0;j<=7;j++)
 62             {
 63                 if(legal[i][j]!=0)
 64                     {
 65                         if(count2==0)
 66                         {
 67                             count2++;
 68                         }
 69                         else
 70                             printf(" ");
 71                         printf("(%d,%d)",i+1,j+1);
 72                     }
 73             }
 74         }
 75         printf("\n");
 76     }
 77     else
 78         {
 79             printf("No legal move.\n");
 80             hasLegal=0;
 81         }
 82 }
 83 void cnt()//输出棋子颜色和个数
 84 {
 85     for(int i=0;i<8;i++)
 86     {
 87         for(int j=0;j<8;j++)
 88         {
 89             if(board[i][j]=='B')
 90                 numb++;
 91             else if(board[i][j]=='W')
 92                 numw++;
 93         }
 94     }
 95 }
 96 void change(int r,int c)//修改棋子
 97 {
 98     int next[8][2]={{0,1},{1,0},{0,-1},{-1,0},{-1,1},{1,1},{1,-1},{-1,-1}};
 99     int nextx=r,nexty=c,cntBack,flag;
100     board[r][c]=cur;
101 //    printf("change board[%d][%d]=%c\n",r+1,c+1,board[r][c]);
102     for(int k=0;k<8;k++,nextx=r,nexty=c)
103     {
104         cntBack=0;
105         flag=0;
106         while(board[nextx][nexty]!='-')
107         {
108             nextx+=next[k][0];
109             nexty+=next[k][1];
110             if(nextx<0||nextx>7||nexty<0||nexty>7)
111                 break;
112             if(board[nextx][nexty]==back)
113                 cntBack++;
114             if(board[nextx][nexty]==cur)
115             {
116                 flag=1;
117                 break;
118             }
119         }
120 //        printf("cntback=%d\n",cntBack);
121         if(cntBack!=0&&flag)
122         {
123             int nexti=r,nextj=c,l;
124             for(l=0,nexti+=next[k][0],nextj+=next[k][1];l<cntBack;l++,nexti+=next[k][0],nextj+=next[k][1])
125             {
126 //                printf("board[%d][%d]",nexti+1,nextj+1);
127                 board[nexti][nextj]=cur;
128 //                printf("board[%d][%d]=%c\n",nexti+1,nextj+1,board[nexti][nextj]);
129             }
130         }
131     }
132 }
133 void print()//打印
134 {
135     for(int i=0;i<8;i++)
136         printf("%s\n",board[i]);
137     if(n!=0)
138         printf("\n");//除最后一行都要输出一个空行
139 }
140 int main()
141 {
142 //    FIN;
143 //    FOUT;
144     char r,c,ch;
145     scanf("%d",&n);
146     while(n--)
147     {
148         for(int i=0;i<8;i++)
149         {
150            scanf("%s",board[i]);
151         }
152         ch=getchar();
153         scanf("%c",&cur);
154         if(cur=='W')
155             back='B';
156         else
157             back='W';
158 //        memset(legal,0,sizeof(legal));//输出测试
159 //        for(int i=0;i<8;i++)
160 //            printf("%s\n",board[i]);
161 //        printf("cur=%c\n",cur);
162         while(cmd=getchar())
163         {
164             if(cmd=='Q')
165             {
166                 //打印
167                 print();
168 //                if(n!=0)
169 //                    printf("XXX\n");
170                 break;
171             }
172             else if(cmd=='L')
173             {
174 //                printf("input L\n");
175                 find();
176                 if(!hasLegal)
177                 {
178                     ch=cur;
179                     cur=back;
180                     back=ch;
181                 }
182 //                printf("cur=%c\n",cur);
183             }
184             else if(cmd=='M')//每次M都要统计输出
185             {
186                 scanf("%c%c",&r,&c);
187 //                printf("r=%c c=%c\n",r,c);
188                 //修改
189                 change(r-'0'-1,c-'0'-1);
190                 numb=numw=0;
191                 cnt();
192                 //输出统计
193                 printf("Black -%3d White -%3d\n",numb,numw);
194 //                print();//打印看看,记得删除
195                 ch=cur;
196                 cur=back;
197                 back=ch;
198             }
199         }
200     }
201     return 0;
202 }

 

posted @ 2019-01-26 15:04  付玬熙  阅读(140)  评论(0编辑  收藏  举报