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 }