模拟问题只需注意在横向标记后需还原以防止影响纵向标记
注意格式!
#include <stdio.h>
#include <string.h>
struct square{
char ch;
int order,mark,used,used1;// order表示所标的数字,mark标黑白块,used用于横向,used1用于纵向
}map[20][20];
struct record{
int i0,j0,mark,mark1;//mark用于横向,mark1用于纵向
}re[200];
int ans;
void printwords(int r0,int c0,int tag){//tag为一表示横向,0表示纵向
int i,j,k,n;
if (tag) {
for (i=1;i<=ans;i++){//按标号大小搜索
if (re[i].mark) {
printf("%3d.",i);//注意输出格式
j=re[i].j0;
k=re[i].i0;
while (map[k][j].mark && j<= c0 && re[map[k][j].order].mark && map[k][j].used) {//判断条件,j在范围内,是白块,
//白块没被走过,有标号白块没被用过
printf("%c",map[k][j].ch);
if (map[k][j].order!=0) re[map[k][j].order].mark=0;
map[k][j].used=0;
j++;
}
printf("\n");
}
}
}
else {
for (i=1;i<=ans;i++){//同上
if (re[i].mark1) {
printf("%3d.",i);
j=re[i].j0;
k=re[i].i0;
while (map[k][j].mark && k<=r0 && re[map[k][j].order].mark1 && map[k][j].used1) {
printf("%c",map[k][j].ch);
if (map[k][j].order!=0 )re[map[k][j].order].mark1=0;
map[k][j].used1=0;
k++;
}
printf("\n");
}
}
}
}
main(){
int r,c,i,j,kase;
kase=1;
re[0].mark=1;
re[0].mark1=1;
while (scanf("%d",&r)==1 && r!=0) {//判断结束
scanf("%d",&c);
ans=1;
getchar();
for (i=0;i<r;i++){
for (j=0;j<c;j++){
if ((map[i][j].ch=getchar())=='*') map[i][j].mark=0;
else map[i][j].mark=1;
map[i][j].used=1;//初始化
map[i][j].used1=1;
}
getchar();
}
for (i=0;i<r;i++){
for (j=0;j<c;j++){
map[i][j].order=0;
if (i==0 || j==0) {
if (map[i][j].mark){
map[i][j].order=ans;
re[ans].i0=i;
re[ans].j0=j;
re[ans].mark=1;
re[ans].mark1=1;
ans++;
}
}
else {
if ((!map[i][j-1].mark || !map[i-1][j].mark) && map[i][j].mark) { //注意理解题目 左边或上边是白块,同时是也是可以的
map[i][j].order=ans;
re[ans].i0=i;
re[ans].j0=j;
re[ans].mark=1;
re[ans].mark1=1;
ans++;
}
}
}
}
if(kase>1) printf("\n");
printf("puzzle #%d:\n",kase);
printf("Across\n");
printwords(r,c,1);
printf("Down\n");
printwords(r,c,0);
kase++;
}
return 0;
}