C# CodinGame记录(7)--[Community Puzzle] abcdefghijklmnopqrstuvwxyz

该博客主要讨论了一种解决n行n列字符串网格中找到从'a'到'z'连通路径的方法。作者提出了一个递归算法,通过ASCII码遍历字符并检查上下左右相邻字符,将找到的路径存入结果数组中。虽然算法能够找到解决方案,但在找到路径后仍会继续遍历剩余部分,没有进行优化。程序实现了读取输入、存储网格、初始化结果数组、遍历并搜索连通路径等功能,并最终输出结果数组。
摘要由CSDN通过智能技术生成

题目: 

在n行n列的字符串中,找到一个从a到z的连线,并输出,其余字符用“-”代替

        肯定得先遍历,逐字判断,然后判断这个char的上下左右

        整两个公有string[n],一个叫ans,一个叫res

        这两个都用“-”填上n行n列;

        然后就想到递归了,用ascii码,从97的a开始,判断正确就+1(b),错误就回溯-1(回到a);

        把几种特殊情况列出来(上下左右的边,还有四个角)

        正确就在ans里把这个字母插在对应的index上,然后删一个“-”;

        最后判断到“z”了,就吧ans复制到res上;

        再把res逐行输出;

        总之就是可以过,但是找到了之后还是会把剩下的都遍历没想到怎么优化

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;

/**
 * Auto-generated code below aims at helping you parse
 * the standard input according to the problem statement.
 **/
class Solution
{
    static string[] ans;
    static string[] res;
    static int aciinum=97;
    static int n;
    static void Main(string[] args)
    {
        n = int.Parse(Console.ReadLine());
        string[] m = new string[n];
        ans= new string[n];
        res= new string[n];
        for (int i = 0; i < n; i++)
        {
            m[i] = Console.ReadLine();
            ans[i] = new string('-',n);
            res[i] = new string('-',n);
            //Console.Error.WriteLine(m[i]);
        }

        // Write an answer using Console.WriteLine()
        // To debug: Console.Error.WriteLine("Debug messages...");

        for(int i =0;i<n;i++){
            for(int j =0;j<n;j++){
                int a =i;
                int b =j;
                Search(m,a,b);  
            }
        }

        for(int i =0;i<n ;i++){
            Console.WriteLine(res[i]);
        }
        
    }

    static void Search(string[] m,int a,int b){
        Console.Error.WriteLine(m[a][b] + "---" + (char)aciinum);
        if(m[a][b] == (char)aciinum){           
            ans[a] = ans[a].Insert(b,m[a][b].ToString());
            ans[a] = ans[a].Remove(b+1,1);
            if(aciinum == 122){
                aciinum = 96;
                for(int i =0;i<n ;i++){
                    res[i] = ans[i];
                }

                return ;
            }
            aciinum ++;
                if(a ==0 && b ==0) {
                    Search(m,a,b+1);
                    Search(m,a+1,b);
                    ans[a] = ans[a].Insert(b,"-");
                    ans[a] = ans[a].Remove(b+1,1);
                    if(aciinum>97) aciinum--;
                }
                if(a ==0 && b == n-1){
                    Search(m,a,b-1);
                    Search(m,a+1,b);
                    ans[a] = ans[a].Insert(b,"-");
                    ans[a] = ans[a].Remove(b+1,1);
                    if(aciinum>97) aciinum--;
                }
                if(a == n-1 && b ==0){
                    Search(m,a,b+1);
                    Search(m,a-1,b);
                    ans[a] = ans[a].Insert(b,"-");
                    ans[a] = ans[a].Remove(b+1,1);
                    if(aciinum>97) aciinum--;
                }
                if(a == n-1 && b ==n-1){
                    Search(m,a,b-1);
                    Search(m,a-1,b);
                    ans[a] = ans[a].Insert(b,"-");
                    ans[a] = ans[a].Remove(b+1,1);
                    if(aciinum>97) aciinum--;
                }       


                if(a ==0 && b !=0 && b != n-1) {
                    Search(m,a,b-1);
                    Search(m,a,b+1);
                    Search(m,a+1,b);
                    ans[a] = ans[a].Insert(b,"-");
                    ans[a] = ans[a].Remove(b+1,1);
                    if(aciinum>97) aciinum--;
                }
                if(b ==0 && a !=0 && a != n-1) {
                    Search(m,a-1,b);
                    Search(m,a+1,b);
                    Search(m,a,b+1);
                    ans[a] = ans[a].Insert(b,"-");
                    ans[a] = ans[a].Remove(b+1,1);
                    if(aciinum>97) aciinum--;
                }
                if(a ==n-1 && b!=0 && b !=n-1) {
                    Search(m,a-1,b);
                    Search(m,a,b+1);
                    Search(m,a,b-1);
                    ans[a] = ans[a].Insert(b,"-");
                    ans[a] = ans[a].Remove(b+1,1);
                    if(aciinum>97) aciinum--;
                }
                if(b ==n-1 && a!=0 && a !=n-1) {
                    Search(m,a-1,b);
                    Search(m,a+1,b);
                    Search(m,a,b-1);
                    ans[a] = ans[a].Insert(b,"-");
                    ans[a] = ans[a].Remove(b+1,1);
                    if(aciinum>97) aciinum--;
                }

                if(b != 0 && b != n-1 && a != 0 && a != n-1) {
                    Search(m,a,b+1);
                    Search(m,a,b-1);
                    Search(m,a+1,b);
                    Search(m,a-1,b);
                    ans[a] = ans[a].Insert(b,"-");
                    ans[a] = ans[a].Remove(b+1,1);
                    if(aciinum>97) aciinum--;
                }                  
        }
        
        return ;
    }
}

结果:

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值