深搜 WA

传送门:http://vjudge.net/contest/view.action?cid=49557#overview

G题:

#include <iostream>
#include <cstring>
#include <stack>
#include <cstdio>
#define N 10
using namespace std;

const int dx[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
const int dy[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
int vis[N][N], fa[N*N];
int m,n;

int dfs (int x, int y, int cnt);
void print (int End);
inline bool inbond (int x, int y)
{
    return (0 <= x && x < n && 0 <= y && y < m);
}

/*void printvis()
{
    for (int y=0; y<m; y++)
    {
        for (int x=0; x<n; x++)
            printf ("%d ",vis[x][y]);
        printf("\n");
    }
    printf ("\n");
}
*/
int main()
{
    int T;
    cin >> T;
    for (int tt=1; tt<=T; tt++){
        cin >> m >> n;
        memset(vis, 0, sizeof(vis));
        fa[0] = 0;
        int temp = dfs (0, 0, 1);
        printf("Scenario #%d:\n", tt);
        if(temp == -1){
            printf("impossible\n");
        }
        else print(temp);
        printf("\n");
    }
    return 0;
}

int dfs (int x, int y, int cnt)
{
    vis[x][y] = 1;
    //printvis();
    if (cnt == m*n) return (y * n + x);
    for (int i=0; i<8; i++){
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (inbond(nx, ny) && !vis[nx][ny]){
            //cout << 1111<<endl;
            fa[ny*n+nx] = y * n + x;
            int temp = dfs(nx, ny, cnt+1);
            if( temp > -1){
                return temp;
            }
            vis[nx][ny] = 0;                                //①
        }
    }
    return -1;
}

void print (int End)
{
    stack<int> dir;
    dir.push(End);
    int a = End, b;                                           //②
    while (1){
        b = fa[a];
        if (a == b) break;
        dir.push(b);
        a = b;
    }
    int temp, x, y;
    while (!dir.empty()){
        temp = dir.top();
        dir.pop();
        y = temp / n;
        x = temp % n;
        printf ("%c%d", x+'A', y+1);
    }
    printf("\n");
}
第一次写深搜,遇到几个问题:

①:这里进行一次深搜之后,忘了吧vis[][]数组置0,

②:刚开始写的是 a = fa[End], 导致最后打印出来的路径少了倒数第二条。


H题:

一次过了,就不贴代码了,不过在本地调试的时候有个小问题,是手残,在if语句后面直接跟了个分号导致的。

I题:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;

int t, n, sum;
int flag;
int ln = 0;
int orgin[15];
int num[15], times[15];
int used[15];

inline bool cmp(int a, int b)
{
    return (a > b);
}
void dfs(int n);
void print();
int main()
{
    while (cin >> t >> n && n){
        for (int i=0; i<n; i++)
            scanf ("%d", &orgin[i]);
        sort(orgin, orgin+n, cmp);
        memset(num, 0, sizeof(num));
        memset(times, 0, sizeof(times));                    //①
        int j = 0;
        for (int i=0; i<n;){
            num[j] = orgin[i];
            while (orgin[i] == num[j]){
                times[j] ++;
                i++;
            }
            j++;
        }
        ln = j;
        /*
        for (int i=0; i<ln; i++) printf ("%d ",num[i]);
        printf ("\n");
        for (int i=0; i<ln; i++) printf ("%d ",times[i]);
        printf ("\n");
        */
        flag = sum = 0;
        memset(used, 0, sizeof(used));
        printf("Sums of %d:\n", t);
        dfs (0);
        if (!flag) printf("NONE\n");
    }
    return 0;
}

void dfs(int n)
{
    if(n >= ln) return ;
    for (int i=times[n]; i>-1; i--){
        sum += i * num[n];
        used[n] = i;
        if (sum == t && n == ln-1){                 //②
            print();
            flag ++;
        }
        dfs(n+1);
        sum -= i * num[n];
    }
}
void print()
{
    /*
    for (int i=0; i<ln; i++) cout <<used[i]<<" ";
    cout <<endl;
    */
    queue<int> q;
    for (int i=0; i<ln; i++){
        for (int j=0; j<used[i]; j++)
            q.push(num[i]);
    }
    printf ("%d", q.front());
    q.pop();
    while (!q.empty()){
        printf ("+%d", q.front());
        q.pop();
    }
    printf ("\n");
}
虽然交上去一次就过了,但在本地调试的时候出了几个问题,浪费好长时间,所以也贴出来了;

①:忘记初始化times[]数组(用来保存每一个数出现的次数),使得第二组之后的测试数据都出现错误;

②:没加n == ln判断条件,使同一种情况重复出现;

J题:

一次过了,在本地调试出了点问题,主要是这两天做棋盘太多了把行和列搞得乱七八糟的,还有就是直接复制的时候,有的地方忘记改动,代码就不贴了。

K题:

#include <iostream>
#include <cstdio>
#include <cstring>
#define MaxN 11
using namespace std;

char grid [MaxN][MaxN];
int n,k;
int vis[MaxN];
int ans;

void dfs (int row, int col, int cnt);
int main()
{
    while (cin >> n >> k && n > -1){
        for (int i=0; i<n; i++)
            scanf("%s", grid[i]);
        ans = 0;
        memset(vis, 0, sizeof (vis));
        dfs(0, 0, 0);
        printf ("%d\n",ans);
    }
    return 0;
}
void dfs (int row, int col, int cnt)
{
    if (cnt == k){ans++; return ; }
    for (int i=row; i<n+1-k+cnt; i++){
        //cout << i <<endl;
        for (int j=0; j<n; j++){                        //①
            if(grid[i][j] == '#' && !vis[j]){
                vis[j] = 1;
                dfs(i+1, j, cnt + 1);
                vis[j] = 0;
            }
        }
    }
}

这道题是交的最没底气的一道题,我自己都不太清楚为什么这样写。

调试的时候有一个错误①:把j的取值范围写成跟i一样了。代码先存着,以后可能还要再看

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值