Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

郁闷死了,关于judge的

Posted by YouHaveWhatThing at 2008-09-08 19:31:06 on Problem 2146
下面这个程序,在check()函数的最后加上while(1)这个死循环就ac了,不加就wa了,用c++就OLE了,为什么啊

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define REP(i,n) for(int i = 0;i < (n);++ i)
#define FOR(i,s,n) for(int i = (s);i < (n);++ i)
#define CLEAR(x) memset(x,0,sizeof(x))
#define N 400
int n,d,tot,a,b,mark;
string w[N],tw[N];
bool dfs(int i,int j,int no)
{
    if(no > d) return 0;
    if(i == w[a].size() && j == w[b].size()) return 1;
    if(w[a][i] == w[b][j]) return dfs(i+1,j+1,no);
    bool ok = 0;
    if(w[a][i] == w[b][j+1] && w[a][i+1] == w[b][j]){
        swap(w[a][i],w[a][i+1]);
        ok |= dfs(i+1,j+1,no+1);
        swap(w[a][i],w[a][i+1]);
    }
    if(w[a][i] == w[b][j+1]) ok |= dfs(i,j+1,no+1);
    if(w[a][i+1] == w[b][j]) ok |= dfs(i+1,j,no+1);
    return ok || dfs(i+1,j+1,no+1);
}
bool check(int _i,int _j)
{
    a = _i,b = _j;
    if(w[b].size() > w[a].size()) swap(a,b);
    if(w[a].size() - w[b].size() > d) return 0;
    if(w[a].size() - w[b].size() == d){
        int i,j,no;
        for(i = 0,j = 0,no = 0;i < w[a].size();i++,j++)
            while(w[a][i] != w[b][j] && i < w[a].size()) {
                i++,no++;
                if(no > d) return 0;
            }
        if(j < w[b].size()) return 0;
        return 1;
    }
    if(d == 1){
        int no = 0;
        REP(i,w[a].size()) if(w[a][i] != w[b][i]) no++;
        if(no <= 1) return 1;
        no = 0;
        REP(i,w[a].size()) if(w[a][i] != w[b][i]) {
            if(w[a][i+1] != w[b][i]) {
                w[a] = tw[a];
                return 0;
            }
            swap(w[a][i],w[a][i+1]),no++;
        }
        w[a] = tw[a];
        if(no <= 1) return 1;
        return 0;
    }
    if(d == 2){
        bool ok;
        if(w[a].size() - w[b].size() == 1){
            REP(i,w[a].size()){
                w[a].erase(i,1);
                if(dfs(0,0,1)) ok = 1;
                w[a] = tw[a];
                if(ok) return 1;
            }
            return 0;
        }
        ok = dfs(0,0,0);
        w[a] = tw[a];
        return ok;
    }
    while(1); //为什么加上这个死循环就ac,不加就wa
}
int main()
{
    while(cin >> n >> d && n)
    {
        REP(i,n) cin >> w[i];
        sort(w,w+n);
        REP(i,n) tw[i] = w[i];
        tot = 0;
        REP(i,n) FOR(j,i+1,n) if(check(i,j)) cout << tw[i] << "," << tw[j] << endl,tot++;
        cout << tot << endl;
    }
    return 0;
}


Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator