HDU 1691 Chinese Chess

http://acm.hdu.edu.cn/showproblem.php?pid=1691

博客里面不好骂人,所以就不说太多了。

有几点注意:

1、象可能跑到不可能达到的位置

2、兵要判断后退这种情况

View Code
  1 #include <stdio.h>

  2 

  3 int map[20][20];

  4 int Kinga,Kingb;//红王坐标 

  5 int Kingc,Kingd;//黑王坐标 

  6 int abs(int a){return a>0?a:-a;}

  7 int KingFaceToFace()//两王是否相对 

  8 {

  9     int i;

 10     if(Kingb==20||Kingd==20)return 0;

 11     if(Kingb==Kingd)

 12     {

 13         for(i=Kingc+1;i<Kinga;i++)

 14             if(map[i][Kingb]!=0)

 15                 return 0;

 16         return 1;

 17     }

 18     return 0;

 19 }

 20 int King(int a,int b,int c,int d)

 21 {

 22     if((abs(a-c)+abs(b-d))!=1)return 0;//王一次走一步 

 23     if(map[a][b]==1&&(a<8||b<4||b>6||c<8||d<4||d>6))//红王出九宫格 

 24         return 0;

 25     if(map[a][b]==8&&(a>3||b<4||b>6||c>3||d<4||d>6))//黑王出九宫格

 26         return 0;

 27     if(map[a][b]==1){

 28         Kinga=c;

 29         Kingb=d;

 30     }

 31     if(map[a][b]==8){

 32         Kingc=c;

 33         Kingd=d;

 34     }

 35     map[c][d]=map[a][b];

 36     map[a][b]=0; 

 37     if(KingFaceToFace())

 38         return 0;

 39     return 1;

 40 }

 41 int Mandarins(int a,int b,int c,int d)

 42 {

 43     if(abs(a-c)!=1||abs(b-d)!=1)return 0;//士走斜一格

 44     if(map[a][b]==2&&(c<8||c>10||d<4||d>6))//红士出九宫格 

 45         return 0;

 46     if(map[a][b]==9&&(c>3||c<1||d<4||d>6))//黑士出九宫格

 47         return 0;

 48     map[c][d]=map[a][b];

 49     map[a][b]=0; 

 50     if(KingFaceToFace())

 51         return 0;

 52     return 1;

 53 }

 54 int Elephants(int a,int b,int c,int d)

 55 {

 56     if(abs(a-c)!=2||abs(b-d)!=2)return 0;//象走田 

 57     if(map[a][b]==3&&(!(((a==6||a==10)&&(b==3||b==7))||(a==8&&(b==1||b==5||b==9)))||!(((c==6||c==10)&&(d==3||d==7))||(c==8&&(d==1||d==5||d==9)))))return 0;//红象非主流 

 58     if(map[a][b]==10&&(!(((a==5||a==1)&&(b==3||b==7))||(a==3&&(b==1||b==5||b==9)))||!(((c==5||c==1)&&(d==3||d==7))||(c==3&&(d==1||d==5||d==9)))))return 0;//黑象非主流 

 59     int x,y;

 60     x=(a+c)/2;

 61     y=(b+d)/2;

 62     if(map[x][y])//别象脚 

 63         return 0;

 64     map[c][d]=map[a][b];

 65     map[a][b]=0;

 66     if(KingFaceToFace())

 67         return 0;

 68     return 1; 

 69 } 

 70 int Knights(int a,int b,int c,int d)

 71 {

 72     int luoma[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};//落马的位置 

 73     int majiao[8][2]={{1,0},{1,0},{-1,0},{-1,0},{0,1},{0,-1},{0,1},{0,-1}};//马脚的位置 

 74     int i;

 75     for(i=0;i<8;i++)

 76     {

 77         if(a+luoma[i][0]==c&&b+luoma[i][1]==d)

 78         {

 79             if(map[a+majiao[i][0]][b+majiao[i][1]])//别马脚 

 80                 return 0;

 81             break;

 82         }

 83     }

 84     if(i==8)return 0;

 85     if(map[c][d]==1)Kinga=Kingb=20;

 86     if(map[c][d]==8)Kingc=Kingd=20;

 87     map[c][d]=map[a][b];

 88     map[a][b]=0;

 89     if(KingFaceToFace())

 90         return 0;

 91     return 1;

 92 }

 93 int Rooks(int a,int b,int c,int d)

 94 {

 95     int i;

 96     if(a!=c&&b!=d)return 0;//车走十字 

 97     if(a==c&&d>b)//车向右走中间不能有子 

 98         for(i=b+1;i<d;i++)

 99             if(map[a][i])

100                 return 0;

101     if(a==c&&d<b)//车向左走中间不能有子

102         for(i=b-1;i>d;i--)

103             if(map[a][i])

104                 return 0;

105     if(b==d&&a>c)//车向上走中间不能有子 

106         for(i=a-1;i>c;i--)

107             if(map[i][b])

108                 return 0;

109     if(b==d&&a<c)//车向下走中间不能有子 

110         for(i=a+1;i<c;i++)

111             if(map[i][b])

112                 return 0;

113     if(map[c][d]==1)Kinga=Kingb=20;

114     if(map[c][d]==8)Kingc=Kingd=20;

115     map[c][d]=map[a][b];

116     map[a][b]=0;

117     if(KingFaceToFace())

118         return 0;

119     return 1; 

120 }

121 int Cannons(int a,int b,int c,int d)

122 {

123     int i,cnt=0;

124     if(a!=c&&b!=d)return 0;//炮走十字 

125     if(a==c&&d>b) 

126     {

127         for(i=b+1;i<d;i++)

128             if(map[a][i]!=0)

129                 cnt++;

130         if(cnt>1||(cnt==1&&map[c][d]==0)||(cnt==0&&map[c][d]))return 0;//中间有一子以上或有一子但不能完成吃子 

131     }

132     if(a==c&&d<b)

133     {

134         for(i=b-1;i>d;i--)

135             if(map[a][i]!=0)

136                 cnt++;

137         if(cnt>1||(cnt==1&&map[c][d]==0)||(cnt==0&&map[c][d]))return 0;

138     }

139     if(b==d&&a>c) 

140     {

141         for(i=a-1;i>c;i--)

142             if(map[i][b]!=0)

143                 cnt++;

144         if(cnt>1||(cnt==1&&map[c][d]==0)||(cnt==0&&map[c][d]))return 0;

145     }

146     if(b==d&&a<c)

147     {

148         for(i=a+1;i<c;i++)

149             if(map[i][b]!=0)

150                 cnt++; 

151         if(cnt>1||(cnt==1&&map[c][d]==0)||(cnt==0&&map[c][d]))return 0;

152     }

153     if(map[c][d]==1)Kinga=Kingb=20;

154     if(map[c][d]==8)Kingc=Kingd=20;

155     map[c][d]=map[a][b];

156     map[a][b]=0;

157     if(KingFaceToFace())

158         return 0;

159     return 1;

160 }

161 int Pawns(int a,int b,int c,int d)

162 {

163     if(abs(a-c)+abs(b-d)!=1)return 0;

164     if(map[a][b]==14&&a<=5)//黑兵没过河只能向前走一步 

165         if(c-a!=1||b!=d)

166             return 0;

167     if(map[a][b]==7&&a>=6)//红兵没过河只能向前走一步

168         if(c-a!=-1||b!=d)

169             return 0;

170     if(map[a][b]==14&&a>5)//黑兵过河后能向前或左或右走一步 

171         if(c-a==-1)

172             return 0; 

173     if(map[a][b]==7&&a<6)//红兵过河后能向前或左或右走一步

174         if(c-a==1)

175             return 0;

176     if(map[c][d]==1)Kinga=Kingb=20;

177     if(map[c][d]==8)Kingc=Kingd=20;

178     map[c][d]=map[a][b];

179     map[a][b]=0;

180     if(KingFaceToFace())

181         return 0;

182     return 1; 

183 }

184 int move(int a,int b,int c,int d,int k)

185 {

186     if(map[a][b]<=k*7||map[a][b]>k*7+7)//红黑方不按顺序走 

187         return 0;

188     if(a>10||b>9||c>10||d>9||a<1||b<1||c<1||d<1)return 0;//越界 

189     if(map[a][b]==0)return 0;//无子

190     if((map[a][b]==1||map[a][b]==2||map[a][b]==3||map[a][b]==4||map[a][b]==5||map[a][b]==6||map[a][b]==7)&&(map[c][d]==1||map[c][d]==2||map[c][d]==3||map[c][d]==4||map[c][d]==5||map[c][d]==6||map[c][d]==7)) 

191         return 0;//红方吃自己的子

192     if((map[a][b]==8||map[a][b]==9||map[a][b]==10||map[a][b]==11||map[a][b]==12||map[a][b]==13||map[a][b]==14)&&(map[c][d]==8||map[c][d]==9||map[c][d]==10||map[c][d]==11||map[c][d]==12||map[c][d]==13||map[c][d]==14))

193         return 0;//黑方吃自己的子 

194     if(map[a][b]==1||map[a][b]==8)//走王 

195         return King(a,b,c,d);

196     if(map[a][b]==2||map[a][b]==9)//走士 

197         return Mandarins(a,b,c,d);

198     if(map[a][b]==3||map[a][b]==10)//走象 

199         return Elephants(a,b,c,d);

200     if(map[a][b]==4||map[a][b]==11)//走马 

201         return Knights(a,b,c,d);

202     if(map[a][b]==5||map[a][b]==12)//走车 

203         return Rooks(a,b,c,d);

204     if(map[a][b]==6||map[a][b]==13)//走炮 

205         return Cannons(a,b,c,d);

206     if(map[a][b]==7||map[a][b]==14)//走兵 

207         return Pawns(a,b,c,d);

208 } 

209 int main()

210 {

211     int t;

212     int n,k;

213     int a,b,c,d;

214     int i,j;

215     int nCase=1;

216     int step;

217     scanf("%d",&t);

218     while(t--)

219     {

220         for(i=1;i<=10;i++)

221         {

222             for(j=1;j<=9;j++)

223             {

224                 scanf("%d",&map[i][j]);

225                 if(map[i][j]==1){

226                     Kinga=i;

227                     Kingb=j;

228                 }

229                 if(map[i][j]==8){

230                     Kingc=i;

231                     Kingd=j;

232                 }

233             }

234         }

235         scanf("%d%d",&n,&k);

236         step=0;

237         for(i=1;i<=n;i++)

238         {

239             scanf("%d%d%d%d",&a,&b,&c,&d);

240             if(!step)

241             {

242                 if(!move(a,b,c,d,k))//非法移动 

243                     step=i;

244                 if(i!=n&&(Kingb==20||Kingd==20))//吃王 

245                     step=i+1;

246             }

247             k=!k;

248         }

249         printf("Case %d: ",nCase++);

250         if(!step)

251             printf("Legal move\n");

252         else

253             printf("Illegal move on step %d\n",step);

254     }

255     return 0;

256 }

 

 

你可能感兴趣的:(chinese)