UVA 232 Crossword Answers

模拟问题只需注意在横向标记后需还原以防止影响纵向标记

注意格式!

#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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值