荒れた海での釣りは、長い時間のためにタッチします。。。長い余韻の基盤が、長い時間のために変更され、荒れた海での釣りとなっている
純粋なC99とは書いた
要約:
書き込み中側に、ほぼライン上、または変更側に1、おおよそのアイデアを
2に、この質問は、それほど難しいことではありません。。。それはそうああ行うには勇気持っている、非常に異常に見えますが
3、荒れた海での釣りZhenshuang
すべてのすべては非常に興味深い課題であります
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
//黑将为1,红军为-1,红帅为-2,通过为0
int red(int [11][10],int,int,int,int,char);
int debug(int [11][10],int,int);
int main(void){
int map[11][10],ying[11][10];
int n,x[11],y[10],i,IsPrime=0,e,mrr1,mrr2,Y1,Y2;
char ch[10];
while((memset(map,0,sizeof(map)))&&(scanf("%d%d%d",&n,&x[0],&y[0])==3&&n)){
Y2=0;
for (i=1;i<=n;i++){
while (scanf("%c",&ch[i])){
if (isupper(ch[i])){
scanf("%d%d",&x[i],&y[i]);
map[x[i]][y[i]]=(ch[i]=='G'?-2:-1);//描点
break;
}
}
}
if(debug(map,x[0],y[0])) {printf("NO\n");continue;}
for (e=1;e<5;e++){
Y1=0;//成功时n个棋子均不能吃到
for (i=1;i<=n;i++){
int m0,n0;
for (n0=0;n0<11;n0++)
for (m0=0;m0<10;m0++)
ying[n0][m0]=map[n0][m0];//每次只对ying输入,每次输入要重新覆盖数据
mrr1=x[0],mrr2=y[0];//原点及其相对应的移动
if (e==1) mrr1+=1;
if (e==2) mrr1-=1;
if (e==3) mrr2+=1;
if (e==4) mrr2-=1;
if (mrr1<1||mrr1>3||mrr2<4||mrr2>6) {Y1++;break;}//出界
if (mrr1==x[i]&&mrr2==y[i]) continue;//被将吃了 (不能用break)
if (red(ying,mrr1,mrr2,x[i],y[i],ch[i])) {Y1++;break; }
}
if (Y1) Y2++;//有一个红军可以吃,则该方向的判定为正确,要坚定四个方向
//printf("Y2=%d\n",Y2);
}
if (Y2==4) printf("YES\n");
else printf("NO\n");
}
return 0;
}
int red(int map[11][10],int x0,int y0,int x,int y,char c){
int n1,n2;
//printf("%d %d\n",x0,y0);
switch (c){
case 'C':{
for (n1=x-1;n1>=1;n1--)
if (map[n1][y]<0){
for (n2=n1-1;n2>=1;n2--){
if (map[n2][y]>=0) map[n2][y]=1;
else break;
}
break;
}
for (n1=x+1;n1<=10;n1++)
if (map[n1][y]<0){
for (n2=n1+1;n2<=10;n2++){
if (map[n2][y]>=0) map[n2][y]=1;
else break;
}
break;
}
for (n1=y-1;n1>=1;n1--)
if (map[x][n1]<0){
for (n2=n1-1;n2>=1;n2--){
if (map[x][n2]>=0) map[x][n2]=1;
else break;
}
break;
}
for (n1=y+1;n1<=9;n1--)
if (map[x][n1]<0){
for (n2=n1+1;n2<=9;n2++){
if (map[x][n2]>=0) map[x][n2]=1;
else break;
}
break;
}
break;
}
case 'H':{//存在出界问题。。。不考虑了
if (!map[x+1][y]) {
map[x+2][y-1]=1;
map[x+2][y+1]=1;
}
if (!map[x-1][y]) {
map[x-2][y-1]=1;
map[x-2][y+1]=1;
}
if (!map[x][y+1]) {
map[x-1][y+2]=1;
map[x+1][y+2]=1;
}
if (!map[x][y-1]) {
map[x-1][y-2]=1;
map[x+1][y-2]=1;
}
break;
}
default :{//RG放一起
for (n1=x+1;n1<11;n1++) {
if (map[n1][y]<0) break;
map[n1][y]=1;
}
for (n1=x-1;n1>=1;n1--) {
if (map[n1][y]<0) break;
map[n1][y]=1;
}
for (n2=y+1;n2<10;n2++) {
if (map[x][n2]<0) break;
map[x][n2]=1;
}
for (n2=y-1;n2>=1;n2--) {
if (map[x][n2]<0) break;
map[x][n2]=1;
}
}
}
/*int m0,n0;
for (n0=0;n0<11;n0++){
for (m0=0;m0<10;m0++)
printf("%2d",map[n0][m0]);
putchar('\n');
}
printf("%d \n",map[x0][y0]);*/
if (map[x0][y0]>0) return 1;//-1时返回值似乎也是0
else return 0;
}
int debug(int map[11][10],int x0,int y0){
int x,n,Y=0;
for (x=10;x>=7;x--)
if (map[x][y0]==-2){
Y=1;
for (n=x-1;n>x0;n--)
if (map[n][y0]<0){
Y=0;
break;
}
}
return Y;
}