1 条题解

  • 0
    @ 2025-6-10 20:46:43

    题意分析

    题目要求解析填字游戏的解决方案,输出所有横向(Across)和纵向(Down)的单词列表。填字游戏由r×cr \times c的黑白方格组成,白色方格包含字母,黑色方格用"*"表示。每个白色方格按特定规则编号:1)位于第一行;2)左侧或上方紧邻黑色方格。横向单词从编号方格开始,连续向右延伸至黑色方格或行尾;纵向单词同理向下延伸。需按编号顺序输出所有单词。

    解题思路

    代码通过模拟实现:1)标记所有符合条件的方格编号;2)扫描每行提取横向单词,每列提取纵向单词;3)将单词按编号存入向量并输出。具体步骤:1)用二维数组a1a1a2a2分别存储原始网格;2)用da[i][j]da[i][j]记录方格编号;3)遍历网格,根据规则计算编号;4)提取横向单词时,从左到右扫描每行,遇到白色方格则连续读取直到结束;5)提取纵向单词同理;6)按格式输出结果,注意编号宽度为3位。

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <string>
    #include <cstring>
    using namespace std;
    //英语    看博友程序     抄博友程序      模拟    
    char a1[20][20];
    char a2[20][20];
    int da[20][20];
    struct nod {
    	string s;
    	int id;
    	nod(string a, int b)
    	{
    		s = a;
    		id = b;
    	}
    };
    int main()
    {
    	int tag = 0;
    	int n, m;
    	while (1)
    	{
    		tag++;
    		cin >> n;
    		if (n == 0)
    		{
    			break;
    		}
    		cin >> m;
    		for (int i = 0; i < n; i++)
    		{
    			for (int j = 0; j < m; j++)
    			{
    				cin >> a1[i][j];
    				a2[i][j] = a1[i][j];
    			}
    		}
    		/*
    		for(int i=0;i<n;i++)
    		{
    			for(int j=0;j<m;j++)
    			{
    				cout<<a1[i][j]<<"  ";
    			}
    			cout<<endl;
    		}*/
    		int js = 1;
    		for (int i = 0; i < n; i++)
    		{
    			for (int j = 0; j < m; j++)
    			{
    				if (a1[i][j] != '*')
    					if ((i == 0 || j == 0) || ((a1[i - 1][j] == '*' && (i - 1) >= 0) || (a1[i][j - 1] == '*' && (j - 1) >= 0)))
    					{
    						da[i][j] = js++;
    					}
    			}
    		}
    		/*
    		for(int i=0;i<n;i++)
    		{
    			for(int j=0;j<m;j++)
    			{
    				cout<<da[i][j]<<" ";
    			}
    			cout<<endl;
    		}*/
    		vector<nod> ve1;
    		for (int i = 0; i < n; i++)
    		{
    			for (int j = 0; j < m; j++)
    			{
    				if (a1[i][j] != '*')
    				{
    					int k = j;
    					string s = "";
    					while (a1[i][k] != '*' && k < m)
    					{
    						s += a1[i][k];
    						a1[i][k] = '*';
    						k++;
    					}
    					//cout<<s<<" "<<da[i][j]<<endl;
    					ve1.push_back(nod(s, da[i][j]));//(nod){s,da[i][j]} CE
    				}
    			}
    		}
    		vector<nod> ve2;
    		for (int i = 0; i < n; i++)
    		{
    			for (int j = 0; j < m; j++)
    			{
    				if (a2[i][j] != '*')
    				{
    					int k = i;
    					string s = "";
    					while (a2[k][j] != '*' && k < n)
    					{
    						s += a2[k][j];
    						a2[k][j] = '*';
    						k++;
    					}
    					ve2.push_back(nod(s, da[i][j]));//(nod){s,da[i][j]} CE
    				}
    			}
    		}
    		printf("puzzle #%d:\n", tag);
    		printf("Across\n");
    		for (int i = 0; i < ve1.size(); i++)
    		{
    			printf("%3d.%s\n", ve1[i].id, ve1[i].s.c_str());
    		}
    		printf("Down\n");
    		for (int i = 0; i < ve2.size(); i++)
    		{
    			printf("%3d.%s\n", ve2[i].id, ve2[i].s.c_str());
    		}
    		printf("\n");
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    889
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者