UVa1589 https://vjudge.net/problem/UVA-1589
udebuger https://www.udebug.com/UVa/1589
点进去有一组测试用例是1000个的,我完全一样,可是网站上提交就是WA,搞了一晚上,心态爆炸,求大神帮我脱离苦海
//UVa 1589 xiangqi 象棋
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef struct
{
char name;
int row;
int col;
}POS;
POS pos[10];
POS way[10];
int length = 7;
bool graph[11][11];
int istool (int prow, int pcol, int row, int col, bool mode)//判断炮在某一条线上是否有炮架子,返回炮架子的位置或0
{
//p是目标, a是炮
//mode = 1表示横, mode = 0 表示纵
int i;
if(mode)//横向
{
if(col < pcol) //炮在左侧
{
for(i = col + 1; i < pcol; ++i)
if(graph[row][i] == 1)return i;
return 0;
}
if(col > pcol) //炮在右侧
for(i = col - 1; i > pcol; --i)
if(graph[row][i] == 1) return i;
return 0;
}
else
{
if(row < prow) //炮在下方
{
for(i = row + 1; i < prow; ++i)
if(graph[i][col] == 1)return i;
return 0;
}
if(row > prow) //炮在上方
{
for(i = row - 1; i > prow; --i)
if(graph[i][col] == 1)return i;
return 0;
}
}
}
bool iskill(int prow, int pcol, int row, int col, char name)//计算红色棋子能否到达P位置
{
if(prow == row && pcol == col) return 0;//不能攻击自身位置
switch(name)//判断红色棋子的属性
{
case 'G': //帅 当帅和P位置一条线且中间没有阻挡的时候,可以到达
if (pcol != col) return 0;
else {
for (int i = prow + 1; i < row; ++i)
if (graph[i][col] == 1) return 0;
return 1;
}
case 'R'://车
if (pcol == col)//同一列的情况,中间不能有阻挡
{
int min = row < prow ? row : prow;
int max = row > prow ? row : prow;
for (int i = min + 1; i < max; ++i)
if (graph[i][col] == 1) return 0;
return 1;
} else if (prow == row)//同一行的情况,中间不能有阻挡
{
int min = col < pcol ? col : pcol;
int max = col > pcol ? col : pcol;
for (int i = min + 1; i < max; ++i)
if (graph[row][i] == 1) return 0;
return 1;
} else return 0;
case 'C':
if (prow == row) //横向炮击
{
int pao = istool(prow, pcol, row, col, 1);//炮架子的位置
if (!pao) return 0;//没有炮架子
//下面是有炮架子的情况,只需要保证炮和目标之间没有棋子即可。
int min = pao < pcol ? pao : pcol;
int max = pao > pcol ? pao : pcol;
for (int i = min + 1; i < max; ++i)
if (graph[row][i] == 1) return 0;
return 1;
}
if (pcol == col)//纵向炮击
{
int pao = istool(prow, pcol, row, col, 0);//炮架子的位置
if (!pao) return 0;//没有炮架子
//下面是有炮架子的情况,只需要保证炮和目标之间没有棋子即可
int min = pao < prow ? pao : prow;
int max = pao > prow ? pao : prow;
for (int i = min + 1; i < max; ++i)
if (graph[i][col] == 1) return 0;
return 1;
}
else return 0;
case 'H':
int dx = pcol - col;//横坐标之差
int dy = prow - row;//纵坐标之差
if(dy == 2)
{
if(dx == 1 || dx == -1)
if(graph[row + 1][col] == 0) return 1;
else return 0;
else return 0;
}
if(dy == -2)
{
if(dx == 1 || dx == -1)
if(graph[row - 1][col] == 0) return 1;
else return 0;
else return 0;
}
if(dx == 2)
{
if(dy == 1 || dy == -1)
if(graph[row][col + 1] == 0) return 1;
else return 0;
else return 0;
}
if(dx == -2)
{
if(dy == 1 || dy == -1)
if(graph[row][col - 1] == 0) return 1;
else return 0;
else return 0;
}
}
}
int getways(int now_row, int now_col)//黑方老将可能的走位
{
switch(now_row)
{
case 1:
switch(now_col)
{
case 4:
way[0].row = 1, way[0].col = 5;
way[1].row = 2, way[1].col = 4;
return 2;
case 5:
way[0].row = 1, way[0].col = 4;
way[1].row = 1, way[1].col = 6;
way[2].row = 2, way[2].col = 5;
return 3;
case 6:
way[0].row = 1, way[0].col = 5;
way[1].row = 2, way[1].col = 6;
return 2;
}
case 2:
switch(now_col)
{
case 4:
way[0].row = 1, way[0].col = 4;
way[1].row = 3, way[1].col = 4;
way[2].row = 2, way[2].col = 5;
return 3;
case 5:
way[0].row = 1, way[0].col = 5;
way[1].row = 3, way[1].col = 5;
way[2].row = 2, way[2].col = 4;
way[3].row = 2, way[3].col = 6;
return 4;
case 6:
way[0].row = 1, way[0].col = 6;
way[1].row = 3, way[1].col = 6;
way[2].row = 2, way[2].col = 5;
return 3;
}
case 3:
switch(now_col)
{
case 4:
way[0].row = 3, way[0].col = 5;
way[1].row = 2, way[1].col = 4;
return 2;
case 5:
way[0].row = 3, way[0].col = 4;
way[1].row = 3, way[1].col = 6;
way[2].row = 2, way[2].col = 5;
return 3;
case 6:
way[0].row = 3, way[0].col = 5;
way[1].row = 2, way[1].col = 6;
return 2;
}
}
}
int main()
{
while(cin >> length >> pos[0].row >> pos[0].col)
{
if(!length) break;
memset(graph, 0, sizeof(graph));
int x;
for(int i = 1; i <= length; ++i)
{
char ch;
while (ch = getchar())
if(ch <= 'Z' && ch >= 'A') break;
pos[i].name = ch;
scanf("%d %d", &pos[i].row, &pos[i].col);
graph[pos[i].row][pos[i].col] = 1;//在棋盘上放置棋子
if(pos[i].name == 'G') x = i;
}
int flag = iskill(pos[0].row, pos[0].col, pos[x].row, pos[x].col, pos[x].name);
if(flag) cout << "NO" << endl;
else
{
int num = getways(pos[0].row, pos[0].col);
int i, j;
for(i = 0; i < num; ++i)
{
for(j = 1; j <= length; ++j)
if(iskill(way[i].row, way[i].col, pos[j].row, pos[j].col, pos[j].name))
break;
if(j > length) break;
}
if(i == num) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
return 0;
}
请问你自己是否分析过原因,做了哪些尝试?