CodeChef submission 129395 (C++ 4.0.0-8) plaintext list. Status: WA, problem J1, contest NOV09. By fun (fun), 2009-11-10 16:29:29.
#include <iostream> #include <vector> using namespace std; typedef struct abc{ int node_row,node_col,node_ele; }node; bool arr_row[10][10],arr_col[10][10],arr_block[10][10],arr_l_d[10],arr_b_d[10]; int de = 0,global_de=0; int pref_arr[10][10]; int arr[10][10]; int global_counter=0,global_empty_counter,global_pos; vector <node>myvect; int get_block(int row,int col) { if (row<=3) { if (col<=3) return 1; if (col<=6) return 2; return 3; } if (row<=6) { if (col<=3) return 4; if (col<=6) return 5; return 6; } if (col<=3) return 7; if (col<=6) return 8; return 9; } int find_next_ele(int row,int col,int seq,int prev) { int count = 0; for(int i=prev;i<=9;i++) { if ((arr_row[row][i]==false && arr_col[col][i]==false && arr_block[get_block(row,col)][i]==false)) { if ((row == col && arr_l_d[i]==false) || row!=col) { if ((row+col==10 && arr_b_d[i]==false) || row+col!=10) { count++; if (count == seq) return i; } } } } return 0; } void set_prob() { int count = 0,min = 10,ele,row,col; for(int k=1;k<=9;k++) { row = k; for(int j=1;j<=9;j++) { col = j; if (arr[k][j] != 0) continue; count = 0; for(int i=1;i<=9;i++) { if ((arr_row[row][i]==false && arr_col[col][i]==false && arr_block[get_block(row,col)][i]==false)) { if ((row == col && arr_l_d[i]==false) || row!=col) { if ((row+col==10 && arr_b_d[i]==false) || row+col!=10) { // ele = i; count++; } } } } // if (pref_arr[row][col] != count){ // if (global_de){ // cout << "not equal row,col,earlier_val,new_val"<<row << col << pref_arr[row][col] << count << endl; // } pref_arr[row][col] = count; node shm; shm.node_row = k; shm.node_col = j; myvect.push_back(shm); // } } } } node find_min_prob(int seq) { node as; int count = 0,min = 10,ele,row=0,col=0,r,c; /* for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) { if (pref_arr[i][j] < min && pref_arr[i][j]>0 && arr[i][j]==0) { min = pref_arr[i][j]; row = i; col = j; if (min == 1) { i= 12; break;} } } }*/ for(int i=global_empty_counter;i<myvect.size();i++){ as = myvect[i]; row = as.node_row ; col = as.node_col; if (pref_arr[row][col] < min){ r = row; c = col; min = pref_arr[r][c];global_pos = i; } } as.node_row = r; as.node_col = c; myvect[global_pos].node_col = myvect[global_empty_counter].node_col; myvect[global_pos].node_row = myvect[global_empty_counter].node_row; myvect[global_empty_counter].node_row = r; myvect[global_empty_counter].node_col = c; global_pos = global_empty_counter++; as.node_ele = find_next_ele(r,c,seq,1); return as; } void set_bool(int row,int col,bool bo,int ele) { arr_row[row][ele] = bo; arr_col[col][ele] = bo; arr_block[get_block(row,col)][ele] = bo; if (row == col) arr_l_d[ele] = bo; if (row + col == 10) arr_b_d[ele] = bo; } void update(node as,bool bo) { int row = as.node_row,col = as.node_col,ele = as.node_ele; node shm; if (bo == false) { global_empty_counter--; arr_row[row][ele] = bo; arr_col[col][ele] = bo; arr_block[get_block(row,col)][ele] = bo; if (row == col) arr_l_d[ele] = bo; if (row+col == 10) arr_b_d[ele] = bo; } if (bo) pref_arr[row][col]--; else pref_arr[row][col]++; for(int i=1;i<=9;i++) { if (bo) { if (!arr[i][col]) { if (!arr_row[i][ele] && !arr_block[get_block(i,col)][ele] && ((i==col && !arr_l_d[ele])|| (i!=col))&& (((i+col==10) && !arr_b_d[ele]) || (i+col!=10))){ pref_arr[i][col]--; } } if (!arr[row][i]) { if (!arr_col[i][ele] && !arr_block[get_block(row,i)][ele] && ((i==row && !arr_l_d[ele])|| (i!=row))&& (((i+row==10) && !arr_b_d[ele]) || (i+row!=10))){ pref_arr[row][i]--; } } } else { if (!arr[i][col]) { if (!arr_row[i][ele] && !arr_block[get_block(i,col)][ele] && ((i==col && !arr_l_d[ele])|| (i!=col))&& (((i+col==10) && !arr_b_d[ele]) || (i+col!=10))){ pref_arr[i][col]++; } } if (!arr[row][i]) { if (!arr_col[i][ele] && !arr_block[get_block(row,i)][ele] && ((i==row && !arr_l_d[ele])|| (i!=row))&& (((i+row==10) && !arr_b_d[ele]) || (i+row!=10))){ pref_arr[row][i]++; } } } } int a,start_row,start_col; a = get_block(row,col); start_row = ( (int) ((a-1)/3))*3 + 1; start_col = ( ((a-1)%3)*3 + 1); for(int i=start_row;i<=start_row+2;i++) { if (i == row) continue; for(int j=start_col;j<=start_col+2;j++) { if ((j != col) && (!(row==col && i==j)) && (!(row+col==10 && i+j==10)) && (!arr[i][j])) if (bo){ if (!arr_col[j][ele] && !arr_row[i][ele] && ((i==j && !arr_l_d[ele])|| (i!=j))&& (((i+j==10) && !arr_b_d[ele]) || (i+j!=10))){ pref_arr[i][j]--; } } else { if (!arr_col[j][ele] && !arr_row[i][ele] && ((i==j && !arr_l_d[ele])|| (i!=j))&& (((i+j==10) && !arr_b_d[ele]) || (i+j!=10))){ pref_arr[i][j]++; } } } } if (row == col) { for(int i=1;i<=9;i++) { if (arr[i][i]) continue; if (bo){ if (!arr_col[i][ele] && !arr_row[i][ele] && (!arr_block[get_block(i,i)][ele]) && (((i+i==10) && !arr_b_d[ele]) || (i+i!=10))){ pref_arr[i][i]--; } } else { if (!arr_col[i][ele] && !arr_row[i][ele] && (!arr_block[get_block(i,i)][ele]) && (((i+i==10) && !arr_b_d[ele]) || (i+i!=10))){ pref_arr[i][i]++; } } } } if (row+col == 10) { for(int i=1;i<=9;i++) { if (arr[i][10-i]) continue; if (bo) { if (!arr_col[10-i][ele] && !arr_row[i][ele] && (!arr_block[get_block(i,10-i)][ele]) && (((i==10-i) && !arr_l_d[ele]) || (i!=10-i))){ pref_arr[i][10-i]--; } } else { if (!arr_col[10-i][ele] && !arr_row[i][ele] && (!arr_block[get_block(i,10-i)][ele]) && (((i==10-i) && !arr_l_d[ele]) || (i!=10-i))){ pref_arr[i][10-i]++; } } } } if (bo){ if (global_empty_counter == global_pos) global_empty_counter++; arr_row[row][ele] = bo; arr_col[col][ele] = bo; arr_block[get_block(row,col)][ele] = bo; if (row == col) arr_l_d[ele] = bo; if (row+col == 10) arr_b_d[ele] = bo; } } int func() { node as; int p,row,col,ele; int count = 1; if (global_counter == 81) return 1; as = find_min_prob(count); if (as.node_ele == 0) { return 0; } if (as.node_row == 0 && as.node_col == 0) return 0; row = as.node_row; col = as.node_col; ele = as.node_ele; arr[row][col] = as.node_ele; global_counter++; update(as,true); while(as.node_ele) { p = func(); if (p) return 1; count++; update(as,false); arr[row][col] = 0; global_counter--; as.node_ele = find_next_ele(as.node_row,as.node_col,count,as.node_ele); if (as.node_ele == 0) break; arr[row][col] = as.node_ele; update(as,true); global_counter++; } return 0; } int main() { int cas,l; cin >> cas; for(int l=0;l<cas;l++) { global_counter = 0;global_de=0; for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) { arr_row[i][j] = false; arr_col[i][j] = false; arr_block[i][j] = false; } arr_l_d[i] = false; arr_b_d[i] = false; } int a; char ch; char str[15]; for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) { cin >> ch; if(ch == '.') arr[i][j] = 0; else { global_counter++; arr[i][j] = ch - '0'; set_bool(i,j,true,arr[i][j]); } } } set_prob(); if (global_counter != 81) a = func(); for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) // printf("%d",arr[i][j]); // printf("\n"); cout << endl; } cout << endl; } }
Comments

