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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步