老规则 题目解释看他们的 代码看我的。。
可能我的代码略微浓缩一些。 。。
。。我找了半天,,代码写的都好长。,要是看懂了题目的话 就看我的代码吧。
http://blog.csdn.net/kyoma/article/details/51824912
要是看不懂代码的话 可以先看下面这个 然后回头再看我这个自己乱搞的。。。
http://bbs.csdn.net/topics/391995414
主要是 实现重复的过程 函数的多次利用。
//current 记录的当前的颜色 W or B。 从主函数开始看 我有引导。
#include<stdio.h>
char board[10][10];
char current;
int chuli(int x,int y,int stepx,int stepy){
int i=0;
while (1) {
i++;
x += stepx;
y += stepy;
if (x<1 || x>9 || y<1 || y>9) break; //貌似是没用的废话,习惯了。。加上边界。
if (board[x][y]==current && i!=1) return 1; // 如果走了一步就出现一样的 说明两个一样的挨着 非法。
if (board[x][y]!=current && board[x][y]!='-') continue;
else break;
}
return 0;
} // 一步一步的走啊 直到出现curren一样的停止 回到main吧
int bracketed(int x,int y){
for (int i=-1;i<=1;i++)
for (int j=-1;j<=1;j++){
if (i==0 && j==0) continue;
if (chuli(x,y,i,j)) return 1;
} //这里脑洞有点大在当前点有8个 方向需要判断 任何一个成立 都是合法位置。 转到chuli(处理 函数)
return 0;
}
void change(int x,int y,int stepx,int stepy){
board[x][y] = current;
while (1) {
x+=stepx;
y+=stepy;
if (board[x][y]==current) break;
if (current=='B') board[x][y]='B';
else board[x][y]='W';
}
} 看懂了chuli 函数 这个没啥区别 只不过改变一下好了 道理比 chuli函数还简单。chuli就是判断一下 这个就翻转一下。 回main吧
int main(){
int T,first=1;
scanf("%d\n",&T);
while (T--) {
first?first=0:putchar(10);
for (int i=1;i<=8;i++)
for (int j=1;j<=8;j++)
if (j==8) {
scanf("%c",&board[i][j]);
getchar();
} else scanf("%c",&board[i][j]);
scanf("%c\n",¤t);
char ch;
while (scanf("%c\n",&ch)){
if (ch=='Q') {
for (int i=1;i<=8;i++)
for (int j=1;j<=8;j++)
if (j==8) printf("%c\n",board[i][j]);
else printf("%c",board[i][j]);
break;
} // 输出结果 不解释了吧。
if (ch=='L'){
int ff=1;
for (int i=1;i<=8;i++)
for (int j=1;j<=8;j++)
if (board[i][j]=='-' && bracketed(i,j)) {// bracked 函数来判断这个位置是否合法位置 转到上面的函数继续分析。
ff?ff=0:putchar(' ');
printf("(%d,%d)",i,j);
}
ff?printf("No legal move.\n"):putchar(10);
}
if (ch=='M') {
int x,y;
scanf("%1d%1d",&x,&y); // 读入数字 一个位置一个位置的读入啊 两个10以内的数字 之间没有空格。
if (!bracketed(x,y)) // 巧妙借用上一个函数,判断是否可以放 不可的话 换下棋的一方。
if (current=='W') current = 'B';else current='W';
for (int i=-1;i<=1;i++)
for (int j=-1;j<=1;j++)
if (i==0 && j==0) continue;
else if (chuli(x,y,i,j)) change(x,y,i,j); // 换过以后就可以了啊。 再次用这个chuli函数。老样子 8个方向来找 看哪个方向可以 就去change棋盘。 转到change
if (current=='W') current = 'B';else current='W';
int black=0,white=0;
for (int i=1;i<=9;i++)
for (int j=1;j<=9;j++){
if (board[i][j]=='B') black++;
if (board[i][j]=='W') white++;
}
printf("Black - %2d White - %2d\n",black,white); // 最后了 TM大坑啊。。两位宽度。。。。。
}
}
}
}