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 }